如何对SAS数据集按入出院日期去重并保留Index1=1的行?
SAS数据集去重:保留同一ID、入出院日期组内Index1=1的行
原始数据集DB
data DB; input ID :$20. Admission :date09. Discharge :date09. Index1; format Admission date9. Discharge date9.; cards; 0001 13JAN2017 25JAN2017 0 0001 22FEB2018 03MAR2018 0 0001 30JAN2019 04MAR2019 0 0001 30JAN2019 04MAR2019 1 0001 25DEC2020 02JAN2021 0 0002 15JAN2014 29JAN2014 1 0002 01FEB2015 10FEB2015 0 0002 01FEB2015 10FEB2015 0 0003 22MAR2019 23MAR2019 1 0003 22MAR2019 23MAR2019 0 0003 02JUL2019 28AUG2019 0 0004 01SEP2022 15SEP2022 1 0004 02DEC2023 05DEC2023 1 ;run;
需求目标
生成数据集DB1:去除同一ID下入出院日期完全相同的重复行,仅保留该组内Index1=1的行;若组内无Index1=1的行,则保留一行Index1=0的行。目标数据集如下:
data DB1; input ID :$20. Admission :date09. Discharge :date09. Index1; format Admission date9. Discharge date9.; cards; 0001 13JAN2017 25JAN2017 0 0001 22FEB2018 03MAR2018 0 0001 30JAN2019 04MAR2019 1 0001 25DEC2020 02JAN2021 0 0002 15JAN2014 29JAN2014 1 0002 01FEB2015 10FEB2015 0 0003 22MAR2019 23MAR2019 1 0003 02JUL2019 28AUG2019 0 0004 01SEP2022 15SEP2022 1 0004 02DEC2023 05DEC2023 1 ;run;
可行实现方法
方法1:PROC SORT + DATA步去重
先按ID、入出院日期排序,同一组内将Index1=1的行排在最前面,再通过BY语句保留每组第一行:
/* 排序:ID→Admission→Discharge,同一组内Index1降序排列 */ proc sort data=DB; by ID Admission Discharge descending Index1; run; /* 保留每组第一行 */ data DB1; set DB; by ID Admission Discharge; if first.Discharge; /* 因同一组内Admission和Discharge完全重复,用first.Admission也可 */ run;
方法2:PROC SQL分组取最大值
直接按ID、入出院日期分组,取每组Index1的最大值,自动保留1(若存在)或0:
proc sql; create table DB1 as select ID, Admission, Discharge, max(Index1) as Index1 from DB group by ID, Admission, Discharge; quit;
两种方法均可实现需求,其中PROC SQL方法无需提前排序,代码更简洁。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

