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

如何筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:02:03