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

R语言如何实现rollApply滚动窗口计算时跳过指定n步

解决方案

方案1:基于现有rowr包实现(无需修改原有计算逻辑)

核心思路:先完成全量逐行滚动计算,再按指定步长筛选保留结果位置,其余替换为NA,完全兼容你现有furrr并行逻辑。

library(tidyverse)
library(rowr)

# 你原有的自定义计算函数无需修改
calc_ex <- function(y){
  sum(y[,1] + y[,2])
}

roll_calc_ex <- function(y, window = 3, skip_step = 2){
  # 先计算全量逐行滚动结果
  full_res <- rowr::rollApply(y, calc_ex, window = window, minimum = window)
  # 构造结果向量,默认全NA
  res_vec <- rep(NA, nrow(y))
  # 计算需要保留结果的位置:从第window行开始,每(skip_step+1)行保留一个
  keep_idx <- seq(from = window, to = nrow(y), by = skip_step + 1)
  res_vec[keep_idx] <- full_res[keep_idx - window + 1]
  # 写入结果
  y %>% mutate(estimate = res_vec)
}

# 测试调用即可得到你期望的输出
roll_calc_ex(df1)

方案2:基于zoo::rollapply实现(原生支持步长参数)

zoo包的rollapply内置by参数可以直接指定滚动步长,无需计算全量逐行结果,性能更优,同时设置by.column = FALSE即可传入多列数据到自定义函数,也支持并行计算需求:

library(zoo)
library(tidyverse)

calc_ex <- function(y){
  sum(y[,1] + y[,2])
}

roll_calc_ex_zoo <- function(y, window = 3, skip_step = 2){
  res_vec <- rollapply(
    data = y[, c("x", "y")], # 传入需要计算的两列
    FUN = calc_ex,
    width = window,
    by = skip_step + 1, # 直接指定步长
    by.column = FALSE, # 不按列单独计算,传入整个窗口矩阵
    fill = NA, # 非计算位置自动填充NA
    align = "right" # 结果对齐到窗口最后一行,和你现有逻辑一致
  )
  y %>% mutate(estimate = as.vector(res_vec))
}

# 测试调用
roll_calc_ex_zoo(df1)

内容的提问来源于stack exchange,提问作者Thomas Fjærvik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:30:00