4. 原始临床数据导入与结构解析

临床研究数据清洗的第一道工程关口,不是“清洗”,而是“把异构原始文件稳定地读进来,并识别出它们各自的结构”。EDC 系统导出的数据、中心实验室的检测结果、影像报告的文本或结构化字段、可穿戴设备的高频时序数据,以及多中心各自命名习惯不同的文件,往往在同一项目里同时存在。若导入阶段没有把结构解析清楚,后续的去重、缺失处理、单位换算和逻辑核查都会建立在错误的数据模型上。

本节的核心任务是建立一条“批量读取—模式识别—结构归一”的导入链路。它要回答三个问题:文件如何被批量发现与读取;文件内部的结构如何被自动识别;识别结果如何映射到统一的目标字段。

一、四类数据源的结构特征

不同来源的数据在结构上差异明显,导入策略必须区别对待。

  • EDC 导出:通常为宽表或长表 CSV/XLSX,含受试者编号、访视、表单、字段名、字段值、录入时间等列。结构相对规整,但不同 EDC 厂商的列名、编码字典和缺失值表示(空串、NA、-9、9999)不一致。
  • 实验室数据:多为“一行一个检测项”的长表,关键字段包括样本号、检测项目代码(如 LOINC 或本地代码)、结果值、单位、参考范围、检测方法、报告时间。同一项目在不同中心可能使用不同单位。
  • 影像报告:可能是 PDF、纯文本或半结构化字段,包含检查部位、影像号、报告结论、RECIST 评估等。结构化程度最低,常需按关键词或正则抽取。
  • 可穿戴设备数据:高频时序,如心率、步数、睡眠分期,采样间隔从秒级到分钟级不等,文件常按设备序列号或日期分片,含时间戳、指标名、数值、质量标记。

多中心异构文件还叠加了命名差异:同一访视可能被写成 V1、Visit1、基线;同一性别字段可能是 M/F、1/2、男/女。导入阶段必须把这些差异收敛到统一编码。

二、批量读取与模式识别

批量读取的第一步是建立文件清单。工程上通常按“项目—中心—数据源—批次”组织目录,例如:

raw/
  center_A/edc/export_20240601.csv
  center_A/lab/lab_20240601.xlsx
  center_B/edc/export_20240601.csv
  center_B/wearable/device_SN001_202406.csv
  center_C/imaging/report_202406.txt

读取时先做文件级模式识别:按扩展名和目录名判断数据源类型,再按文件名中的日期、中心、设备号提取元数据。对 CSV 需处理编码(UTF-8、GBK)、分隔符(逗号、制表符、分号)和引号转义;对 XLSX 需指定工作表;对文本报告需按行或段落切分。

字段级模式识别是更关键的一步。常用方法包括:

  • 列名匹配:用同义词字典把“受试者编号”“Subject ID”“SUBJID”映射到统一字段 subject_id。
  • 值域识别:通过取值分布判断某列是性别、日期还是数值。例如某列取值集中在 {M,F},可识别为性别。
  • 格式识别:用正则识别日期(YYYY-MM-DD、DD/MM/YYYY)、时间戳、单位(mg/dL、mmol/L)。
  • 结构识别:判断文件是宽表还是长表,长表需按“指标名—值”对进行透视。

下面这张图展示了从多源原始文件到统一结构表的导入与解析链路,重点体现文件级识别、字段级识别和结构归一三个环节的输入输出关系。

多源原始数据导入与结构解析链路 原始文件(多中心) EDC 导出 CSV / XLSX 宽表 实验室数据 长表 + 单位/参考范围 影像报告 PDF / 文本 / 半结构化 可穿戴设备 高频时序 + 质量标记 多中心异构文件 命名/编码不一致 文件级模式识别 扩展名 / 目录名 判断数据源类型 文件名解析 中心 / 日期 / 设备号 编码 / 分隔符 UTF-8 / GBK / 逗号 工作表 / 分片 XLSX sheet / 时序分片 批次元数据 导入时间 / 来源标记 字段级识别与结构归一 列名同义词匹配 SUBJID → subject_id 性别 → sex 值域识别 {M,F} → 性别 数值分布 → 检测值 格式识别 日期 / 时间戳正则 单位 mg/dL、mmol/L 结构识别 宽表 / 长表判断 长表透视 统一目标结构(示例字段) subject_id | center_id | visit | data_source item_code | value | unit | report_time | quality_flag 解析结果输出 结构映射表 + 未识别字段清单 异常文件日志(编码/分隔符/缺失) 文件级识别确定“读什么、怎么读”,字段级识别确定“读成什么”,两者共同支撑后续清洗

三、结构归一与映射表

识别出字段含义后,需要把各来源字段映射到统一目标结构。一个可用的目标结构至少包含:受试者标识、中心标识、访视、数据源类型、检测项代码、结果值、单位、报告时间、质量标记。映射关系建议用一张可维护的映射表管理,而不是硬编码在脚本里。

来源 原始字段 目标字段 转换规则
EDC SUBJID subject_id 去空格、统一大写
实验室 TEST_CODE item_code 本地代码映射到 LOINC
实验室 RESULT_UNIT unit mg/dL → mmol/L(×0.0555)
可穿戴 timestamp report_time 统一为 ISO 8601
影像 报告结论文本 finding 关键词/正则抽取

单位换算必须显式记录换算系数和方向。例如血糖从 mg/dL 转为 mmol/L,系数为 0.0555;若反向转换则除以该系数。参照系一旦确定,全文和图示保持一致,避免同一字段在不同中心出现两种单位混用。

四、异常处理与质量检查

导入阶段最常见的异常包括:文件编码错误导致中文乱码、分隔符不一致导致列错位、日期格式混杂、单位缺失、长表透视后出现重复键。处理策略是“先记录、再隔离、后修复”:

  • 对无法识别的文件,写入异常日志并跳过,不中断整批导入。
  • 对列错位,按列数与预期不符进行标记,人工确认后再重读。
  • 对单位缺失,标记 quality_flag 为“单位待确认”,不直接参与换算。
  • 对重复键,按“受试者+访视+检测项+时间”判断,保留最新报告时间并记录冲突。
导入完成后,建议输出一份“结构解析报告”:各来源文件数、成功解析行数、未识别字段清单、单位缺失数量、重复键数量。这份报告是后续清洗步骤的输入依据,也是多中心数据质量的第一份证据。

把导入与结构解析做扎实,后续的缺失值处理、逻辑核查和统计分析才有可靠的数据基础。工程上应把文件清单、映射表、异常日志和解析报告作为可复现的交付物固定下来,使同一批原始数据在任何时间都能被一致地读入和解释。