SAS月度数据集合并:按Unique_ID去重并替换VAR1≤0的行
SAS数据集合并问题:替换低VAR1行并新增Unique_ID
需求说明
我有多个包含MIA_CURR列的月度数据集,需要合并成一个数据集,每个Unique_ID仅保留一行,规则如下:
- 新增首个数据集(DATA1)中不存在的
Unique_ID行(来自后续数据集如DATA2) - 若DATA1中某行的
VAR1≤0,则用后续数据集(DATA2)的对应行替换该行
我尝试的PROC SQL代码(未达预期)
PROC SQL; CREATE TABLE DATA3 AS SELECT * FROM DATA1 UNION SELECT * FROM DATA2 AS B WHERE NOT EXISTS ( SELECT * FROM DATA1 AS A WHERE A.UNIQUE_ID= B.UNIQUE_ID or a.VAR1>0 ) ; QUIT;
示例数据
DATA1
| Unique_ID | VAR1 | VAR2 | VAR3 | VAR4 | VAR5 |
|---|---|---|---|---|---|
| 00001 | 0 | 3 | w | 1 | 0 |
| 00002 | -2.22 | 2 | e | 0 | 9 |
| 00003 | 3 | 2 | f | 0 | 8 |
| 00004 | 1 | 2 | v | 0 | 9 |
DATA2
| Unique_ID | VAR1 | VAR2 | VAR3 | VAR4 | VAR5 |
|---|---|---|---|---|---|
| 00001 | 1 | 3 | w | 1 | 0 |
| 00005 | -1.012 | 2 | t | 0 | 7 |
| 00006 | 0 | 2 | t | 1 | 6 |
| 00002 | 1 | 2 | f | 0 | 9 |
期望输出DATA3
| Unique_ID | VAR1 | VAR2 | VAR3 | VAR4 | VAR5 |
|---|---|---|---|---|---|
| 00001 | 1 | 3 | w | 1 | 0 |
| 00002 | 1 | 2 | f | 0 | 9 |
| 00003 | 3 | 2 | f | 0 | 8 |
| 00004 | 1 | 2 | v | 0 | 9 |
| 00005 | -1.012 | 2 | t | 0 | 7 |
| 00006 | 0 | 2 | t | 1 | 6 |
问题分析与修正代码
原代码问题
原NOT EXISTS子句的逻辑错误:A.UNIQUE_ID=B.UNIQUE_ID OR a.VAR1>0会导致两种情况都无法选中DATA2的行——只要DATA1存在任意VAR1>0的行,或者B的ID在DATA1中,就会过滤掉B的行,完全不符合需求。
正确PROC SQL代码
PROC SQL; CREATE TABLE DATA3 AS /* 保留DATA1中VAR1>0的行 */ SELECT * FROM DATA1 WHERE VAR1 > 0 UNION /* 从DATA2中选取两类行: 1. DATA1中不存在的Unique_ID 2. DATA1中存在但VAR1≤0的对应行(用于替换) */ SELECT B.* FROM DATA2 AS B LEFT JOIN DATA1 AS A ON A.UNIQUE_ID = B.UNIQUE_ID WHERE A.UNIQUE_ID IS NULL /* DATA1无此ID,新增 */ OR A.VAR1 <= 0; /* DATA1有此ID但VAR1≤0,替换 */ QUIT;
替代方案:DATA步实现
如果更习惯用DATA步,也可以通过合并标记的方式实现:
DATA DATA3; MERGE DATA1(in=in_data1) DATA2(in=in_data2); BY UNIQUE_ID; /* 处理ID同时存在于两个数据集的情况:DATA1的VAR1≤0则用DATA2的行 */ IF in_data1 AND in_data2 THEN DO; IF DATA1.VAR1 <= 0 THEN SET DATA2; ELSE OUTPUT; END; /* 新增DATA1没有的ID行 */ ELSE IF in_data2 THEN OUTPUT; /* 保留DATA1中VAR1>0的行 */ ELSE IF in_data1 AND DATA1.VAR1 > 0 THEN OUTPUT; RUN;
内容的提问来源于stack exchange,提问作者MLPNPC
相关产品推荐
相关产品推荐

