You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS数据集去重:从work.test1生成含唯一hhid的work.test2数据集

SAS: 生成仅含唯一HHID的数据集(按bin规则筛选)

问题背景

现有SAS数据集work.test1,包含以下4个变量:

  • hhid:家庭ID
  • pid:个人ID
  • pidlink:hhid与pid的组合标识
  • bin:仅取值1或2

示例数据如下:

obshhidpidpidlinkbin
110600110600011
210600110600011
310800110800011
410800110800011
510800210800021
610800210800022
712200112200011
812200112200012

需求说明

需要创建数据集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的结果如下:

obshhidpidpidlinkbin
110600110600011
210800210800022
312200112200012

内容的提问来源于stack exchange,提问作者stunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:47:28