如何在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
相关产品推荐
相关产品推荐

