如何将20余种分析物从SAS宽表转置为SDTM LB域长表?
实现SDTM LB域数据集的合并与转置方法
方法一:使用SAS实现
核心步骤
- 合并多份结构一致的实验室原始数据集
- 将宽表转置为长表,提取分析物名称并映射至
LBTEST,结果值映射至LBORRES - 匹配同一分析物的测试名称与结果值,生成符合SDTM规范的LB域结构
代码示例
/* 1. 合并多份实验室数据集 */ data lab_combined; set lab_dataset1 lab_dataset2 lab_dataset3; /* 替换为实际数据集名称 */ keep STUDYID COUNTRY SITE SUBJID LBTST_: LBRES_:; /* 保留标识符及所有分析物相关变量 */ run; /* 2. 转置宽表为长表 */ proc transpose data=lab_combined out=lb_long(rename=(_name_=var_name)) prefix=value; by STUDYID COUNTRY SITE SUBJID; var LBTST_: LBRES_:; run; /* 3. 拆分变量名,区分测试名称与结果值 */ data lb_temp; set lb_long; lab_name = scan(var_name, 2, '_'); /* 提取下划线后的分析物标识 */ if index(var_name, 'LBTST_') then LBTEST = value; else if index(var_name, 'LBRES_') then LBORRES = value; run; /* 4. 合并同一分析物的测试名称与结果 */ proc sort data=lb_temp; by STUDYID COUNTRY SITE SUBJID lab_name; run; data sdtm_lb; merge lb_temp(where=(LBTEST is not missing)) lb_temp(where=(LBORRES is not missing)); by STUDYID COUNTRY SITE SUBJID lab_name; keep STUDYID COUNTRY SITE SUBJID LBTEST LBORRES; /* 可补充LBDTC、LBORRESU等SDTM必填变量,根据原始数据调整 */ run;
方法二:使用Python(Pandas)实现
核心步骤
- 加载并合并多份实验室数据集
- 利用
melt函数转置宽表,拆分变量名提取分析物信息 - 通过透视表匹配测试名称与结果值,整理为SDTM LB域结构
代码示例
import pandas as pd # 1. 加载并合并多份实验室数据集 lab_files = ['lab_dataset1.csv', 'lab_dataset2.csv', 'lab_dataset3.csv'] lab_combined = pd.concat([pd.read_csv(f) for f in lab_files], ignore_index=True) # 2. 筛选目标变量 id_vars = ['STUDYID', 'COUNTRY', 'SITE', 'SUBJID'] value_vars = [col for col in lab_combined.columns if col.startswith(('LBTST_', 'LBRES_'))] # 3. 转置为长表 lb_long = lab_combined.melt(id_vars=id_vars, value_vars=value_vars, var_name='var_name', value_name='value') # 4. 拆分变量名,提取类型与分析物名称 lb_long[['var_type', 'lab_name']] = lb_long['var_name'].str.split('_', expand=True) # 5. 透视匹配测试名称与结果值 sdtm_lb = lb_long.pivot_table( index=id_vars + ['lab_name'], columns='var_type', values='value', aggfunc='first' ).reset_index() # 6. 整理最终结构 sdtm_lb.rename(columns={'LBTST': 'LBTEST', 'LBRES': 'LBORRES'}, inplace=True) sdtm_lb = sdtm_lb[id_vars + ['LBTEST', 'LBORRES']] # 保存结果 sdtm_lb.to_csv('sdtm_lb.csv', index=False)
注意事项
- 需根据原始数据的变量命名规则调整拆分逻辑(如变量名无下划线时,需改用其他字符串处理方式)
- 需补充SDTM LB域的必填变量(如
LBDTC、LBORRESU等),可从原始数据中提取或生成
内容的提问来源于stack exchange,提问作者edc2sdtm
相关产品推荐
相关产品推荐

