如何在SAS中保留每个患者首个Index=1的记录并将其余设为缺失?
SAS数据处理:保留每个患者第一条Index=1记录,其余设为缺失
现有SAS数据集DB包含ID、Admission、Discharge、Index字段,部分患者存在多条Index=1的记录。需生成数据集DB1,要求每个患者仅保留第一条Index=1的记录,其余同患者的Index=1设为缺失,非1的Index值保持不变。
解决方案代码
/* 按ID和入院日期排序,确保记录顺序符合业务逻辑(若需按原始输入顺序判断"第一条",可改为仅按ID排序) */ proc sort data=DB; by ID Admission; run; /* 生成目标数据集DB1 */ data DB1; set DB; by ID; retain first_index_flag 0; /* 临时标记:是否已找到当前ID的第一条Index=1 */ /* 每个ID的第一条记录初始化标记 */ if first.ID then first_index_flag = 0; /* 仅处理Index=1的记录 */ if Index = 1 then do; if first_index_flag = 0 then do; first_index_flag = 1; /* 标记已找到第一条Index=1,保留原值 */ end; else do; Index = .; /* 后续的Index=1设为缺失 */ end; end; drop first_index_flag; /* 删除临时变量,避免输出数据集冗余 */ run;
代码逻辑说明
- 排序处理:通过
proc sort按ID和Admission排序,确保每个患者的记录按入院时间先后排列,保证第一条Index=1是该患者最早的对应记录;若业务上需要按原始输入顺序判断“第一条”,可修改排序语句为by ID;。 - BY组标记:利用
by ID分组,通过first.ID识别每个患者的起始记录,重置临时标记变量。 - 值修正:用
retain语句维持标记变量的状态,遇到Index=1时,根据标记判断是否为第一条记录:是则保留值,否则设为缺失;非Index=1的记录保持原有值不变。
输入数据集DB示例
data DB; input ID :$20. Admission :date09. Discharge :date09. Index; format Admission date9. Discharge date9.; cards; 0001 13JAN2015 20JAN2015 1 0001 21FEB2015 31DEC2015 1 0001 01MAR2018 30SEP2018 . 0002 01JAN2015 31MAR2015 1 0002 01MAY2015 31OCT2015 1 0003 08FEB2014 10MAR2014 1 0004 04MAY2016 10MAY2016 1 0004 13JUN2016 15NOV2016 1 0004 09DEC2016 31DEC2016 1 ;
期望输出数据集DB1示例
data DB1; input ID :$20. Admission :date09. Discharge :date09. Index; format Admission date9. Discharge date9.; cards; 0001 13JAN2015 20JAN2015 1 0001 21FEB2015 31DEC2015 . 0001 01MAR2018 30SEP2018 . 0002 01JAN2015 31MAR2015 1 0002 01MAY2015 31OCT2015 . 0003 08FEB2014 10MAR2014 1 0004 04MAY2016 10MAY2016 1 0004 13JUN2016 15NOV2016 . 0004 09DEC2016 31DEC2016 . ;
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

