You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:13:20