如何将同ID下非缺失的Variable2值移至All非缺失的观测行?
SAS数据处理:迁移同一ID下的Variable2非缺失值
原始数据集(have)
data have; input ID :$20. Admission :date09. Discharge :date09. All Variable1 Variable2; format Admission date9. Discharge date9.; cards; 0001 13JAN2015 20JAN2015 2.45 3.5 . 0001 21FEB2015 31DEC2015 . . 2.3 0002 01JAN2015 31DEC2015 2.00 7.5 . 0002 14FEB2020 21FEB2020 . . 1.0 ; run;
目标数据集(want)
data want; input ID :$20. Admission :date09. Discharge :date09. All Variable1 Variable2; format Admission date9. Discharge date9.; cards; 0001 13JAN2015 20JAN2015 2.45 3.5 2.3 0001 21FEB2015 31DEC2015 . . . 0002 01JAN2015 31DEC2015 2.00 7.5 1.0 0002 14FEB2020 21FEB2020 . . . ; run;
需求说明
将同一ID下Variable2的非缺失值,迁移至该ID中All变量非缺失的观测行,同时将原Variable2非缺失行的Variable2置为缺失。
解决方案
方法1:BY组+RETAIN变量处理
先对数据集按ID排序,再利用BY组逻辑和RETAIN变量保留同一ID的Variable2非缺失值,完成赋值和清空操作:
/* 按ID排序,确保同ID观测连续 */ proc sort data=have; by ID; run; data want; set have; by ID; /* 定义临时变量存储同一ID的Variable2非缺失值 */ retain _temp_var2; /* 每个ID的第一行初始化临时变量 */ if first.ID then _temp_var2 = .; /* 捕获非缺失的Variable2值 */ if not missing(Variable2) then _temp_var2 = Variable2; /* 给All非缺失的行赋值Variable2 */ if not missing(All) then Variable2 = _temp_var2; /* 原Variable2非缺失的行,清空该变量 */ else if not missing(Variable2) then Variable2 = .; /* 删除临时变量 */ drop _temp_var2; run;
方法2:SQL提取映射+合并处理
先通过SQL提取每个ID对应的Variable2非缺失值,再合并回原始数据集完成替换:
/* 提取每个ID的Variable2非缺失值(假设每个ID仅一个非缺失值) */ proc sql; create table var2_id_map as select ID, max(Variable2) as target_var2 from have where not missing(Variable2) group by ID; quit; /* 合并并更新Variable2 */ data want; merge have var2_id_map; by ID; /* 给All非缺失的行赋值 */ if not missing(All) then Variable2 = target_var2; /* 原Variable2非缺失的行清空 */ else if not missing(have.Variable2) then Variable2 = .; /* 删除中间变量 */ drop target_var2; run;
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

