基于多记录填充结果变量的SDTM.QS数据集处理最优方法咨询
基于PROC TRANSPOSE实现DLQI7参数的AVAL赋值方案
完全可以通过PROC TRANSPOSE结合COALESCE函数实现需求,同时能高效保证每个受试者每访视仅保留一条DLQI7记录,以下是具体实现步骤和代码:
1. 预处理:筛选目标记录
先从SDTM.QS中筛选出QSTESTCD为DLQI7或DLQI7SCO的记录,减少后续处理的数据量:
data qs_target; set sdtm.qs; where qtestcd in ('DLQI7', 'DLQI7SCO'); keep usubjid visitnum qtestcd qsstresn qsorres; run;
2. 转置DLQI7SCO记录
用PROC TRANSPOSE将同一位受试者同一访视下的DLQI7SCO的QSSTRESN转成列变量,这样每条DLQI7记录可以直接匹配到对应访视的评分值:
proc transpose data=qs_target(where=(qtestcd='DLQI7SCO')) out=dlqi7sco_wide(drop=_name_ _label_); by usubjid visitnum; id qtestcd; var qsstresn; run;
这里BY语句按受试者和访视分组,ID指定用QSTESTCD作为列名,转置后每个USUBJID+VISITNUM组合仅保留一行,列DLQI7SCO存储对应的评分值。
3. 合并数据并赋值AVAL
将DLQI7的主记录和转置后的DLQI7SCO数据合并,再用COALESCE和条件判断生成AVAL:
data adam.param(where=(paramcd='DLQI7')); merge qs_target(where=(qtestcd='DLQI7') rename=(qtestcd=paramcd)) dlqi7sco_wide; by usubjid visitnum; * 按规则赋值AVAL; aval = coalesce(dlqi7sco, ifc(qsorres='00', 0, .)); * 保留必要字段,按需调整; keep usubjid visitnum paramcd aval qsorres; run;
COALESCE函数优先取非空的DLQI7SCO值(即匹配到的有效评分);- 如果
DLQI7SCO不存在或为空,则判断原DLQI7记录的QSORRES是否为00,是则赋值0,否则留空(可根据需求调整默认值); WHERE语句确保最终只保留PARAMCD为DLQI7的记录,且通过BY合并自动保证每个USUBJID+VISITNUM仅一条记录。
4. 极端情况处理(可选)
如果存在同一受试者同一访视多条DLQI7记录的极端情况,可通过PROC SORT加NODUPKEY去重:
proc sort data=adam.param nodupkey; by usubjid visitnum paramcd; run;
这个方案的优势是利用PROC TRANSPOSE高效聚合同组数据,结合COALESCE简化条件判断逻辑,代码简洁且性能稳定,适合处理大规模临床试验数据。
内容的提问来源于stack exchange,提问作者smackersz88
相关产品推荐
相关产品推荐

