SAS如何实现分组内基于近两季度数据计算AVG与STD
原代码问题定位
- 原始数据存在同季度跨phase的乱序排布,用
by type phase notsorted时,只要相邻记录的type+phase值不连续相同,就会判定为分组边界。比如AA-C 202003下先出现phase3的98,接着是phase1、phase2的记录,再回到phase3的48,系统会把同一个phase拆成两个独立分组,取数逻辑完全错位。 - 数据没有按quarter字段排序,
lag()是按数据步读取的物理记录顺序抓前值,不是自动按时间顺序匹配相邻季度,就算分组逻辑正确,取到的前序counter值也不是时序上最近的上一季度数据。
正确实现方法
1. 先做全局排序
按type、phase、quarter三个字段升序排序,把同一个type+phase下的所有记录严格按时间先后理顺,避免乱序导致的分组断裂:
proc sort data=have; by type phase quarter; run;
2. 分组计算两期指标
排序完成后,BY语句不需要加notsorted选项,每个type+phase的连续记录就是完整的时序序列,直接用lag()抓紧邻前一条的counter值,到分组最后一条(也就是最新季度的记录)时触发均值和标准差计算:
data want; set have; by type phase; * 因已按quarter排序,lag()抓到的counter就是时序上紧邻的上一条记录值; prev_counter = lag(counter); * 到达每个type+phase分组的最后一条记录时计算指标; if last.phase then do; avg = mean(prev_counter, counter); std = std(prev_counter, counter); keep type phase avg std; output; end; run;
结果匹配校验
运行后输出完全符合预期规则:
- BB-B 1:最近两期counter为79、17,均值48
- BB-B 2:最近两期counter为20、2,均值11
- BB-B 3:最近两期counter为88、100,均值94
- AA-C 1:最近两期counter为23、7,均值15
- AA-C 2:最近两期counter为39、9,均值24
- AA-C 3:最近两期counter为98、48,均值73
内容的提问来源于stack exchange,提问作者TangerCity
相关产品推荐
相关产品推荐

