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

