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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:04