在SAS中实现数据集双向匹配筛选(替代Excel VLOOKUP繁琐操作)
解决SAS中保留双向匹配行的问题
需求说明
需要保留数据集中同时满足以下两个条件的行:
- 当前行的
frompc值在数据集的topc列中存在匹配项 - 当前行的
topc值在数据集的frompc列中存在匹配项
以你提供的示例数据集为例,最终需保留第2、3行,移除不满足条件的第1、4行。
方法一:使用Proc SQL实现
通过子查询分别校验两个匹配条件,筛选同时符合要求的行:
proc sql; create table matched_rows as select a.* from your_dataset a where exists (select 1 from your_dataset b where b.topc = a.frompc) and exists (select 1 from your_dataset c where c.frompc = a.topc); quit;
代码解释
- 第一个
exists子查询:确认当前行的frompc值能在其他行的topc列中找到 - 第二个
exists子查询:确认当前行的topc值能在其他行的frompc列中找到 - 仅同时满足两个条件的行,会被保留到新表
matched_rows中
方法二:使用Merge(数据步)实现
先提取两类字段的唯一值列表,再通过两次匹配逐步筛选符合条件的记录:
步骤1:生成唯一值列表
/* 提取所有不重复的topc值 */ proc sort data=your_dataset nodupkey out=topc_list; by topc; run; /* 提取所有不重复的frompc值 */ proc sort data=your_dataset nodupkey out=frompc_list; by frompc; run;
步骤2:两次匹配筛选
/* 第一步:保留frompc在topc列表中的行 */ data temp1; merge your_dataset(in=a) topc_list(in=b rename=(topc=frompc)); by frompc; if a and b; run; /* 第二步:保留temp1中topc在frompc列表中的行 */ data matched_rows; merge temp1(in=a) frompc_list(in=b rename=(frompc=topc)); by topc; if a and b; run;
代码解释
- 先用
proc sort生成无重复的字段值列表,避免重复匹配导致的冗余 - 第一次merge筛选出
frompc存在匹配的行,第二次merge在该结果基础上,进一步筛选topc存在匹配的行,最终得到符合双向匹配要求的记录
验证结果
针对你提供的示例数据集,两种方法都会输出以下结果:
| frompc | topc |
+----------------+--------------+
| F19232342208 | F19451367689 |
| M20011105436 | F19232342208 |
内容的提问来源于stack exchange,提问作者Peter Giakoumelos
相关产品推荐
相关产品推荐

