如何用Proc Compare生成仅含差异观测及对应BASE/COMPARE的输出数据集
解决SAS Proc Compare输出差异观测对应三行记录的问题
实现思路
- 借助
proc compare的outall参数生成包含所有观测(BASE、COMPARE、DIF行)的完整对比数据集,保留系统生成的差异标识变量。 - 先筛选出存在差异的ID列表,再基于该列表提取对应ID的DIF、BASE、COMPARE行,排除无差异的观测。
具体代码
1. 生成完整对比数据集
proc compare base = pre_upd.pre_update compare = post_upd.post_update out = temp.full_compare outall /* 保留每组观测的BASE/COMPARE/DIF三行记录 */ outnoequal; /* 生成差异标记变量 */ id subj_recpos; run;
2. 筛选差异ID并提取目标行
/* 提取所有存在差异的subj_recpos */ proc sql noprint; create table temp.diff_ids as select distinct subj_recpos from temp.full_compare where _type_ = 'DIF' and _ok_ = 0; /* _ok_=0代表该ID存在变量差异 */ quit; /* 仅保留有差异ID对应的三行记录 */ data results.final_results; merge temp.full_compare temp.diff_ids; by subj_recpos; if not missing(subj_recpos); run;
关键说明
outall是核心参数:它会让proc compare为每个对比ID输出三条记录,分别通过_type_变量标记为BASE(基准数据集行)、COMPARE(对比数据集行)、DIF(差异计算行)。_ok_变量用于判断差异:_ok_=1表示该ID下所有变量均无差异,_ok_=0表示存在至少一个变量差异。- 通过两步筛选,既保留了差异ID的完整三行记录,又彻底排除了无差异的观测(如示例中的ID_02)。
内容的提问来源于stack exchange,提问作者morgandow
相关产品推荐
相关产品推荐

