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

基于R语言:如何用简洁向量化方式生成连续重叠数值块?

向量化生成连续重叠数值块的R实现

给定初始代码:

x <- 1:10
block.size <- 3L

目标是生成连续且重叠的长度为3的数值块,预期输出如下:

1,2,3
2,3,4
3,4,5
4,5,6
5,6,7
6,7,8
7,8,9
8,9,10

原循环实现代码(修正了原代码中len的笔误,应为block.size):

block.nums <- length(x) - block.size + 1
blocks <- vector(mode = "list", length = block.nums)

for (i in 1:block.nums) {
  blocks[[i]] <- i:(i+block.size-1)
}

简洁的向量化实现

方法1:使用基础包embed()函数

embed()是R基础包中专门用于生成滑动窗口序列的函数,只需一行代码即可完成需求,完全替代循环:

# 生成矩阵格式的结果
blocks_matrix <- as.data.frame(embed(rev(x), block.size))[, rev(seq(block.size))]

# 如果需要列表格式(和原循环输出一致)
blocks_list <- split(blocks_matrix, seq(nrow(blocks_matrix)))

注:embed(rev(x), block.size)会先生成反向的滑动窗口矩阵,通过反转列顺序即可得到正向的连续重叠块。

方法2:矩阵索引向量化生成

通过构造索引矩阵直接提取x的元素,同样无需循环:

block.nums <- length(x) - block.size + 1
# 生成矩阵格式的结果
blocks_matrix <- matrix(
  x[sequence(rep(block.size, block.nums)) + rep(0:(block.nums-1), each = block.size)],
  nrow = block.nums,
  byrow = TRUE
)
# 转换为列表格式
blocks_list <- split(blocks_matrix, seq(nrow(blocks_matrix)))

以上两种方式都是完全向量化的操作,相比循环更简洁高效,尤其当x长度较大时性能优势更明显。

内容的提问来源于stack exchange,提问作者umbe1987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:40:09