SAS实现滑动窗口求和:基于已有列生成新列的方法问询
在SAS中实现滑动窗口求和生成新列
你需要的是固定窗口大小的滑动求和(窗口大小21),SAS有几种简便方法,无需手动循环:
方法1:SAS SQL窗口函数(推荐)
SAS 9.4及以上版本支持窗口函数,可直接通过SUM()结合窗口子句实现。这种方法代码简洁,执行效率高。
假设你的数据集名为have,目标列是GivenColumn,生成新列NewColumn:
proc sql; create table want as select GivenColumn, -- 窗口为当前行 + 后续20行(共21行),按原始行号排序 sum(GivenColumn) over (order by _n_ rows between current row and 20 following) as NewColumn from have; quit;
- 如果你的数据集有专属排序字段(如日期、ID),请用该字段替换
_n_,保证窗口顺序正确。 - 若窗口是当前行及之前20行(前21行),只需将窗口子句改为
rows between 20 preceding and current row。
方法2:DATA步数组实现(兼容旧版本)
如果使用的SAS版本不支持窗口函数,可通过临时数组存储窗口内的数值,再求和:
data want; set have; /* 定义临时数组,大小为窗口长度21 */ array window_vals[21] _temporary_; /* 循环覆盖数组元素,保持最新21行的数据 */ window_vals[mod(_n_-1, 21)+1] = GivenColumn; /* 计算窗口和:不足21行时取已有的所有行求和 */ current_window_len = min(_n_, 21); NewColumn = sum(of window_vals[1:current_window_len]); run;
这种方法灵活性强,可根据需求调整窗口逻辑(比如跳过缺失值)。
方法3:PROC EXPAND(SAS/ETS模块)
若你的SAS安装了ETS模块,可使用PROC EXPAND快速计算移动统计量:
proc expand data=have out=want; /* 将GivenColumn转换为NewColumn,计算窗口大小21的移动和 */ convert GivenColumn = NewColumn / transformout=(movsum 21 window=0 20); run;
movsum 21指定移动和的窗口大小为21;window=0 20表示窗口包含当前行(0偏移)和后续20行,符合你要求的滑动规则。
内容的提问来源于stack exchange,提问作者ng510
相关产品推荐
相关产品推荐

