如何在SAS Enterprise Guide中按VAL2优先级筛选聚合ID对应数据
用SAS实现指定规则的数据筛选与去重
首先先创建可复现的测试数据集:
/* 创建测试数据集 */ data test_data; input VAL1 $ ID VAL2 $; datalines; P1 123 P P1 123 P P1 123 S S2 44 C S2 44 S GG 44 P P1 58 S P1 58 S ; run;
方法一:PROC SQL实现
核心逻辑是给每个ID+VAL1分组,按VAL2的优先级(P/C > S)标记排序,取每组第一条记录:
proc sql; create table desired_output as select ID, VAL1, VAL2 from ( select ID, VAL1, VAL2, /* 标记优先级:P/C为高优先级(1),S为低优先级(2) */ case when VAL2 in ('P','C') then 1 else 2 end as priority, /* 按ID、VAL1分组,按优先级升序生成行号 */ row_number() over (partition by ID, VAL1 order by calculated priority) as rn from test_data ) t where rn = 1; quit;
逻辑说明:
- 用
case语句给符合需求的P/C记录赋予更高优先级; row_number()窗口函数在ID+VAL1分组内,按优先级排序后生成行号;- 筛选
rn=1即可得到每个ID+VAL1对应的目标记录,优先保留P/C,无P/C则保留S。
方法二:常规SAS数据步实现
通过排序+by语句去重的方式,先把P/C记录排在每组前面,再保留第一条:
/* 自定义VAL2的排序优先级:P、C在前,S在后 */ proc format; value $val2_prio 'P' = '1' 'C' = '2' 'S' = '3'; run; /* 按ID、VAL1分组,再按自定义优先级排序 */ proc sort data=test_data; by ID VAL1 VAL2 $val2_prio.; run; /* 保留每个ID+VAL1的第一条记录 */ data desired_output; set test_data; by ID VAL1; if first.VAL1; run;
逻辑说明:
- 自定义格式让P/C的排序权重高于S,排序后每组内的P/C记录会排在最前面;
- 用
first.VAL1标记每组的第一条记录,直接保留即可满足需求。
运行上述任意一种方法,都能得到你期望的输出结果:
| ID | VAL1 | VAL2 |
|---|---|---|
| 123 | P1 | P |
| 44 | S2 | C |
| 44 | GG | P |
| 58 | P1 | S |
内容的提问来源于stack exchange,提问作者unbik
相关产品推荐
相关产品推荐

