按ID标记重复入院出院日期:为首次记录设Index=1其余设缺失值
实现SAS数据集按ID分组标记首次重复记录
原始数据集DB
data DB; input ID :$20. Admission :date09. Discharge :date09.; format Admission date9. Discharge date9.; cards; 0001 13JAN2017 25JAN2017 0001 13JAN2017 25JAN2017 0001 13JAN2017 25JAN2017 0001 11MAR2017 16MAY2017 0001 30JAN2019 04MAR2019 0002 11SEP2014 15SEP2014 0002 28DEC2014 03JAN2015 0002 28DEC2014 03JAN2015 ; run;
目标需求与示例
要求按ID分组,每组内Admission和Discharge日期完全重复的记录,仅首次出现的记录将Index设为1,其余重复记录的Index设为缺失值,目标数据集DB1如下:
data DB1; input ID :$20. Admission :date09. Discharge :date09. Index; format Admission date9. Discharge date9.; cards; 0001 13JAN2017 25JAN2017 1 0001 13JAN2017 25JAN2017 . 0001 13JAN2017 25JAN2017 . 0001 11MAR2017 16MAY2017 1 0001 30JAN2019 04MAR2019 1 0002 11SEP2014 15SEP2014 1 0002 28DEC2014 03JAN2015 1 0002 28DEC2014 03JAN2015 . ; run;
解决方案代码
步骤1:排序数据集
先将原始数据集按ID、Admission、Discharge排序,确保相同ID下的重复入院出院记录连续排列:
proc sort data=DB; by ID Admission Discharge; run;
步骤2:生成目标数据集
利用SAS的BY语句自动生成的first.临时变量,标记每组的第一条记录:
data DB1; set DB; by ID Admission Discharge; /* 仅当前ID-Admission-Discharge组合的第一条记录设置Index为1,其余设为缺失 */ if first.Discharge then Index = 1; else Index = .; run;
代码说明
proc sort:将同一ID下的相同入院出院日期记录归为连续组,保证first.Discharge变量能准确识别每组的起始记录。by ID Admission Discharge:SAS会自动创建first.Discharge临时变量,该变量值为1时,表示当前记录是ID-Admission-Discharge组合的第一条记录。- 条件赋值:通过
if-else语句判断first.Discharge的值,为1时Index设为1,否则设为缺失值。也可以用条件函数简化写法:Index = ifn(first.Discharge, 1, .);
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

