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
相关产品推荐
相关产品推荐

