SAS按组逆累积求和:解决组首出现负数的问题
分组数据中计算每日原始计数的SAS代码修正
问题说明
现有分组的每日累计上报数据,需计算每日原始计数。使用DIF()函数结合BY GROUP语句时,新组的第一条记录未重置计算逻辑,导致出现负数结果,需修正代码逻辑。
示例数据与原代码
data have; input group $ date :yymmdd10. count_cumu; format date ddmmyy10.; datalines; A 2022-03-01 2 A 2022-03-02 8 A 2022-03-03 16 A 2022-03-04 22 B 2022-03-01 3 B 2022-03-02 8 B 2022-03-03 20 B 2022-03-04 26 run; proc sort data=have; by group date; run; data want; set have; count_raw = coalesce(dif(count_cumu), count_cumu); by group; run;
当前输出问题
原代码中,DIF()函数会跨BY组计算差值,导致新组第一条记录的count_raw为当前组首累计值减去上组末累计值(如B组第一条得到3-22=-19),不符合需求。
期望结果
每个组的第一条记录count_raw等于该条的count_cumu,后续记录为当前count_cumu与同组上一条count_cumu的差值:
- A组:2,6,8,6
- B组:3,5,12,6
解决方法
方法1:利用FIRST.group标志重置计算
通过BY GROUP生成的first.group变量判断组起始,组首记录直接取累计值,其余记录计算同组内差值:
data want; set have; by group; if first.group then count_raw = count_cumu; else count_raw = dif(count_cumu); run;
方法2:用RETAIN变量手动维护同组累计值
通过RETAIN保存上一条同组的累计值,手动计算差值,逻辑更直观:
data want; set have; by group; retain prev_cumu; if first.group then do; count_raw = count_cumu; prev_cumu = count_cumu; end; else do; count_raw = count_cumu - prev_cumu; prev_cumu = count_cumu; end; run;
核心原因
DIF()函数仅依赖观测顺序,不会识别BY组边界。结合first.group标志或RETAIN变量,可以确保差值计算仅在同组内进行,新组起始时重置原始计数为当前累计值。
内容的提问来源于stack exchange,提问作者Quinterpret
相关产品推荐
相关产品推荐

