如何在SAS中按ID计算同Class记录间的日期间隔(days_diff)
SAS按ID和Class分组计算相邻日期间隔天数
需求说明
现有已按id和date排序的数据集,需在每个id范围内,对相同class的相邻数据记录计算日期间隔天数,生成days_diff变量:
- 每个
id内某class的第一条记录,days_diff设为0 - 后续同
class的记录,计算与上一条同class记录的日期间隔
原始数据集(HAVE)
id date class 1 01/01/2022 A 1 06/02/2022 B 1 28/02/2022 A 1 08/10/2022 B 2 01/01/2022 B 2 06/02/2022 B 2 28/02/2022 A 2 08/10/2022 A
目标数据集(WANT)
id date class days_diff 1 01/01/2022 A 0 1 06/02/2022 B 0 1 28/02/2022 A 58 1 08/10/2022 B 244 2 01/01/2022 B 0 2 06/02/2022 B 36 2 28/02/2022 A 0 2 08/10/2022 A 222
解决方案
无需手动编写循环,利用SAS的BY组处理和RETAIN语句即可实现,代码如下:
/* 先确保date是SAS日期格式(如果原始数据是字符型需转换)*/ data want; set have; by id class; /* 保留上一条同ID同Class记录的日期 */ retain prev_date; /* 统一日期显示格式 */ format date prev_date ddmmyy10.; if not(date = .) then do; if first.class then do; days_diff = 0; prev_date = date; end; else do; days_diff = intck('day', prev_date, date); prev_date = date; end; end; /* 清理跨ID的缓存日期,避免干扰下一组计算 */ if last.id then call missing(prev_date); run;
代码关键点解释
- BY id class:按
id和class分组,SAS自动生成first.class和last.class变量,标记每组的第一条/最后一条记录 - RETAIN prev_date:让
prev_date变量在数据步循环中保留值,不会每次迭代重置为缺失 - first.class判断:如果是当前
id内该class的第一条记录,days_diff设为0,并将当前日期存入prev_date - intck函数:精准计算上一条同
class记录与当前记录的日期间隔天数 - last.id清理:处理完某个
id的最后一条记录时,清空prev_date,避免影响下一个id的计算
验证结果
运行上述代码后,生成的want数据集将与目标数据集完全匹配,可直接用于后续的阈值判断逻辑。
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

