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

如何在SAS中标记同一ID同一日期的记录出现次数(单次/多次)

解决SAS中按ID和日期标记记录出现次数的问题

需求说明

需要为数据集have中的每条记录新增变量occ:

  • 当同一ID在同一日期仅有1条记录时,occ赋值为1
  • 当同一ID在同一日期存在多条记录时,所有对应记录的occ赋值为2

原数据集(have)

data have;
input id date ;
datalines ;
1 nov10
1 nov15
2 nov11
2 nov11
2 nov14
3 nov12
4 nov17
4 nov19
4 nov19
etc...;

目标数据集(want)

data want;
input id date occ;
datalines;
1 nov10  1
1 nov15  1
2 nov11  2
2 nov11  2
2 nov14  1
3 nov12  1
4 nov17  1
4 nov19  2
4 nov19  2
etc...;

问题分析

你尝试的代码仅会将每个ID-date组的第一条记录标记为1,后续记录标记为2,无法实现同组所有记录统一标记的需求。

解决方案

方法1:使用PROC SQL(简洁直观)

通过子查询计算每个ID-date组合的记录数,再与原表关联赋值:

proc sql;
    create table want as
    select a.*, 
           case when b.record_count > 1 then 2 else 1 end as occ
    from have as a
    left join (
        select id, date, count(*) as record_count
        from have
        group by id, date
    ) as b
    on a.id = b.id and a.date = b.date;
quit;

方法2:使用DATA步+BY组(高效适合大数据)

先通过BY组生成每个ID-date组合的occ标记,再合并回原数据集:

/* 确保数据集按ID和日期排序(若未排序需执行) */
proc sort data=have;
    by id date;
run;

/* 生成每个ID-date对应的occ标记 */
data temp_occ;
    set have;
    by id date;
    if last.date then do;
        /* 同一组只有一条记录则occ=1,否则=2 */
        occ = ifn(first.date, 1, 2);
        output;
    end;
    keep id date occ;
run;

/* 合并得到最终数据集 */
data want;
    merge have temp_occ;
    by id date;
run;

方法3:单DATA步实现(无需额外合并)

利用BY组和循环统计组内记录数,直接赋值:

proc sort data=have;
    by id date;
run;

data want;
    set have;
    by id date;
    retain occ;
    if first.date then do;
        count = 0;
        /* 循环统计当前ID-date组的记录数 */
        do i = _n_ by 1 until(last.date);
            set have(keep=id date) point=i;
            count + 1;
        end;
        /* 根据计数赋值occ */
        occ = (count > 1) + 1;
    end;
    output;
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:26