如何筛选SAS数据集DB中PNE与其他Code同日期出现的ID全量记录?
SAS数据集筛选:保留同一ID+日期下同时存在PNE和其他Code的记录
原始数据集DB
data DB; input ID :$20. Date :date9. Code :$20.; format Date date9.; cards; 0001 07JUL2014 PNE 0001 07JUL2014 CARD 0001 04MAY2016 ANEST 0002 19MAR2014 CARD 0002 22MAR2014 OCU 0003 27JUN2022 ALT 0004 18OCT2015 OCU 0004 18OCT2015 DER 0004 18OCT2015 PNE 0005 10AUG2019 PNE ; run;
目标数据集DB1
需要筛选出同一ID的同一日期下,既存在Code为PNE的记录,又存在其他不同Code记录的所有相关记录,结果如下:
data DB1; input ID :$20. Date :date9. Code :$20.; format Date date9.; cards; 0001 07JUL2014 PNE 0001 07JUL2014 CARD 0004 18OCT2015 OCU 0004 18OCT2015 DER 0004 18OCT2015 PNE ; run;
实现方法
方法1:PROC SQL关联筛选
通过子查询先定位符合条件的ID+Date组合,再关联原表取出对应所有记录:
proc sql; create table DB1 as select a.* from DB a inner join ( -- 筛选出同时存在PNE和其他Code的ID+Date组 select ID, Date from DB group by ID, Date having max(Code='PNE') = 1 /* 组内存在PNE记录 */ and count(distinct Code) > 1 /* 组内至少有两种不同Code */ ) b on a.ID = b.ID and a.Date = b.Date; quit;
方法2:DATA步+BY组处理
先按ID+Date排序,再在BY组内标记符合条件的组,最后输出组内所有记录:
-- 先按ID和Date排序,确保BY组处理正常 proc sort data=DB; by ID Date; run; data DB1; set DB; by ID Date; /* 保留组内标记变量,跨记录传递 */ retain has_pne has_other output_flag; /* 每个ID+Date组的第一条记录,初始化标记 */ if first.Date then do; has_pne = 0; has_other = 0; end; /* 标记当前组是否存在PNE和其他Code */ if Code = 'PNE' then has_pne = 1; else has_other = 1; /* 组内最后一条记录时,判断是否符合筛选条件 */ if last.Date then do; output_flag = (has_pne and has_other); end; /* 仅输出符合条件的组的记录 */ if output_flag then output; run;
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

