You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:32:30