SAS数据集去重:从work.test1生成含唯一hhid的work.test2数据集
SAS: 生成仅含唯一HHID的数据集(按bin规则筛选)
问题背景
现有SAS数据集work.test1,包含以下4个变量:
hhid:家庭IDpid:个人IDpidlink:hhid与pid的组合标识bin:仅取值1或2
示例数据如下:
| obs | hhid | pid | pidlink | bin |
|---|---|---|---|---|
| 1 | 10600 | 1 | 1060001 | 1 |
| 2 | 10600 | 1 | 1060001 | 1 |
| 3 | 10800 | 1 | 1080001 | 1 |
| 4 | 10800 | 1 | 1080001 | 1 |
| 5 | 10800 | 2 | 1080002 | 1 |
| 6 | 10800 | 2 | 1080002 | 2 |
| 7 | 12200 | 1 | 1220001 | 1 |
| 8 | 12200 | 1 | 1220001 | 2 |
需求说明
需要创建数据集work.test2,要求每个hhid仅出现一次,筛选规则为:
- 如果某个
hhid存在bin=2的记录,就保留该hhid对应的bin=2记录 - 如果该
hhid没有bin=2的记录,则保留bin=1的记录
解决方案
下面提供三种常用的实现方法,你可以根据数据集大小和个人习惯选择:
方法1:PROC SQL 关联查询
这种方法逻辑直观,通过子查询先确定每个hhid对应的目标bin值,再关联原表提取记录:
proc sql; create table work.test2 as select distinct t1.* from work.test1 t1 inner join ( /* 子查询:计算每个hhid的最大bin值(2>1,刚好匹配需求) */ select hhid, max(bin) as target_bin from work.test1 group by hhid ) t2 on t1.hhid = t2.hhid and t1.bin = t2.target_bin order by t1.hhid; quit;
说明:distinct用来确保同hhid同bin的重复记录只保留一条,最终每个hhid唯一。
方法2:DATA步 + BY组处理
先排序让目标记录排在每个hhid组的最前面,再用BY组的first.hhid筛选第一条记录,效率很高,适合大数据集:
/* 第一步:按hhid升序、bin降序排序,确保每个hhid下bin=2的记录优先 */ proc sort data=work.test1 out=test_sorted; by hhid descending bin; run; /* 第二步:只保留每个hhid组的第一条记录 */ data work.test2; set test_sorted; by hhid; if first.hhid; /* 仅当是当前hhid的第一条记录时才保留 */ run;
说明:排序后,每个hhid组里的第一条就是我们需要的记录(有bin=2就取2,无则取1),代码简洁高效。
方法3:PROC SORT + NODUPKEY 简化实现
如果你的数据集里,同hhid同bin下的其他变量(如pid、pidlink)不需要严格区分,用这个方法最快捷:
proc sort data=work.test1 out=work.test2 nodupkey; by hhid descending bin; run;
说明:nodupkey会自动删除BY组内重复的键值,这里BY组是hhid + 降序bin,所以每个hhid只会保留bin值最大的那条记录,自动完成去重。
预期输出
最终work.test2的结果如下:
| obs | hhid | pid | pidlink | bin |
|---|---|---|---|---|
| 1 | 10600 | 1 | 1060001 | 1 |
| 2 | 10800 | 2 | 1080002 | 2 |
| 3 | 12200 | 1 | 1220001 | 2 |
内容的提问来源于stack exchange,提问作者stunt
相关产品推荐
相关产品推荐

