在SAS中标记ID、事件日期时间与事件原因重复的观测值的方法咨询
在SAS中标记ID、事件日期时间与事件原因重复的观测值的方法咨询
当然可以解决这个问题!你需要标记那些**ID、事件日期时间(event_dt_tm)、事件原因(event)**完全相同但event_ID不同的观测,下面给你两种实用的SAS方法,按需选择:
方法一:DATA步+BY组处理(需先排序)
这种方法适合需要精细控制标记逻辑的场景,比如区分「是否属于重复组」或者「是否为非首次的重复观测」:
- 先按分组变量排序(BY组处理要求数据集有序):
proc sort data=test; by ID event_dt_tm event; run;
- 创建标记变量:
data test_with_flag; set test; by ID event_dt_tm event; /* 方案1:标记所有属于重复组的观测(包括组内第一个) */ if first.event and last.event then is_duplicate = 0; else is_duplicate = 1; /* 如果你只想标记组内非首次的重复观测,替换成下面这行: is_duplicate = not first.event; */ run;
代码解释
by ID event_dt_tm event会将数据集按这三个变量分组,相同组合的观测会被分到一组first.event和last.event同时为真时,说明该组只有1条观测,不是重复;否则组内有多条观测,标记为重复- 要是选第二种标记逻辑(
not first.event),组内第一条观测会被标记为0,后续的重复观测标记为1
方法二:PROC SQL窗口函数(无需排序)
如果不想额外排序,用PROC SQL的窗口函数会更简洁,一步就能生成标记:
proc sql; create table test_with_flag as select t.*, case when count(*) over (partition by ID, event_dt_tm, event) > 1 then 1 else 0 end as is_duplicate from test t; quit;
代码解释
count(*) over (partition by ID, event_dt_tm, event)会计算每个分组的观测数量- 通过case判断,如果分组数量大于1,说明是重复组,标记为1;否则为0
- 这种方法不需要提前排序,代码更紧凑,适合快速生成标记
额外小技巧:标记重复序号
如果需要知道同组内是第几个重复观测,可以在DATA步里加一个序号变量:
data test_with_flag_and_seq; set test; by ID event_dt_tm event; if first.event then dup_seq = 1; else dup_seq + 1; is_duplicate = (dup_seq > 1); /* 标记非首次的重复 */ run;
这样dup_seq会显示当前观测在组内的序号,is_duplicate则标记是否为非首次的重复观测。
你可以根据自己的实际需求调整标记逻辑,测试这些代码应该就能得到你想要的结果啦!
备注:内容来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

