SAS技术问询:如何保留两个数据集共有的ID记录(含重复)并移除数据集中非共有ID记录?
搞定SAS里筛选两数据集共有ID重复记录的问题
问题拆解
你要的是把dataset2里所有ID和dataset1重合的记录(包括重复的ID条目)都留下来,但之前写的代码有俩小问题:
- 你查询的是
dataset1而不是目标的dataset2,方向搞反啦 - SQL语句结尾多了个逗号,属于语法错误
正确的两种实现方式
方式1:PROC SQL 子查询(简洁高效)
调整查询对象和语法,直接从dataset2里筛选ID存在于dataset1中的记录即可:
proc sql; select * from dataset2 where ID in (select distinct ID from dataset1); /* 加distinct是为了只取dataset1里的唯一ID,提升查询速度 */ quit;
这里用distinct ID是因为我们只需要确认ID是否存在,不需要重复的ID值,这样运行效率更高,同时完全不影响保留dataset2中的重复记录。
方式2:数据步合并(适合大数据量场景)
如果你的数据集包含大量重复记录,用数据步合并的逻辑更直观,处理效率也不错:
/* 先提取dataset1里的唯一ID列表 */ proc sort data=dataset1 nodupkey out=unique_ids; by ID; run; /* 把dataset2和唯一ID列表合并,只保留匹配上的记录 */ data desired_output; merge dataset2(in=a) unique_ids(in=b); by ID; if a and b; /* 只保留同时存在于dataset2和unique_ids中的记录 */ run;
这里用in=a标记来自dataset2的记录,in=b标记来自唯一ID列表的记录,if a and b就确保只留下dataset2里ID在dataset1中的所有条目,包括重复的那些。
结果验证
运行上述任意一段代码后,输出的数据集就和你期望的完全一致:
ID Sex
00001 F
00001 F
00002 F
00002 F
00002 F
.... ....
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

