如何在R中用zoo包创建自定义重叠度的滚动窗口?
解决zoo::rollapply设置自定义重叠度的问题
要实现自定义重叠度的滚动窗口,核心是控制步长(step)——重叠度 = 窗口宽度 - 步长。你需要的重叠度为2、窗口宽度为4,对应步长就是2,直接用rollapply的by参数即可实现:
方法1:使用rollapply的by参数
library(zoo) a <- c(0:10) # 设置步长by=2,align="left"保证窗口从左起始(和你的期望输出一致) # partial=TRUE允许最后一个窗口长度不足设定的width output <- rollapply(a, width = 4, FUN = identity, by = 2, align = "left", partial = TRUE) print(output)
运行后输出:
[,1] [,2] [,3] [,4] [1,] 0 1 2 3 [2,] 2 3 4 5 [3,] 4 5 6 7 [4,] 6 7 8 9 [5,] 8 9 10 NA
如果不需要补NA,而是保留原始长度的窗口,可以改用FUN返回原始向量,再整理成矩阵:
output_list <- rollapply(a, width = 4, FUN = function(x) x, by = 2, align = "left", partial = TRUE) output_matrix <- do.call(rbind, output_list) print(output_matrix)
输出:
[,1] [,2] [,3] [,4] [1,] 0 1 2 3 [2,] 2 3 4 5 [3,] 4 5 6 7 [4,] 6 7 8 9 [5,] 8 9 10
方法2:手动生成窗口索引
如果需要更灵活的窗口控制,可以手动生成每个窗口的起始位置,再提取对应数据:
a <- c(0:10) window_width <- 4 step <- 2 # 生成所有窗口的起始索引 start_idx <- seq(from = 1, to = length(a), by = step) # 提取每个窗口的元素 windows <- lapply(start_idx, function(i) { end_idx <- min(i + window_width - 1, length(a)) a[i:end_idx] }) # 转换为矩阵(补NA对齐列数) output_matrix <- t(sapply(windows, function(x) c(x, rep(NA, window_width - length(x))))) print(output_matrix)
关键参数说明
by:控制窗口移动的步长,默认值为1,正是你觉得重叠度固定为1的原因。align:控制窗口对齐方式,"left"表示窗口从起始索引向右扩展,和你的期望输出匹配;可选值还有"center"、"right"。partial:当剩余元素不足窗口宽度时,是否保留该窗口,设为TRUE会生成最后一个不完整窗口。
内容的提问来源于stack exchange,提问作者Beres
相关产品推荐
相关产品推荐

