R语言如何将向量拆分为首元素回弹的等长重叠子向量
父向量拆分需求
需要对父向量做拆分,满足以下4个条件:
- 每个子向量的长度固定为常数
l - 相邻子向量的重叠长度为
l-1 - 子向量的总数量为
length(ts) - l + 2 - 最后一个子向量的末尾元素为父向量的首元素
现有尝试存在的问题
第一次尝试
ts <- 1:11 # 父向量 l <- 7 # 子向量固定长度 m <- length(ts) - l + 1 # 子向量数量 split(t(embed(ts, m))[m:1,], 1:m)
该代码输出的子向量长度为7符合要求,但子向量总数只有5,不符合预期的6个。
第二次尝试
调整子向量数量参数为m <- length(ts) - l + 2,代码如下:
ts <- 1:11 # 父向量 l <- 7 # 子向量固定长度 m <- length(ts) - l + 2 # 子向量数量 split(t(embed(ts, m))[m:1,], 1:m)
该代码输出的子向量总数为6符合要求,但每个子向量长度变为6,不符合长度要求。
期望输出
#$`1` #[1] 1 2 3 4 5 6 7 #$`2` #[1] 2 3 4 5 6 7 8 #$`3` #[1] 3 4 5 6 7 8 9 #$`4` #[1] 4 5 6 7 8 9 10 #$`5` #[1] 5 6 7 8 9 10 11 #$`6` #[1] 6 7 8 9 10 11 1
解决方案
核心思路是先对原向量做扩展,在末尾追加首元素,补足最后一个滑动窗口的缺失元素,再做拆分即可,实现代码如下:
ts <- 1:11 # 父向量 l <- 7 # 子向量固定长度 m <- length(ts) - l + 2 # 预期子向量数量 # 扩展原向量,末尾添加首元素 ts_ext <- c(ts, ts[1]) # 生成滑动窗口矩阵,调整元素顺序后拆分 result <- split(t(embed(ts_ext, l))[l:1, ], 1:m)
运行代码即可得到符合所有要求的拆分结果。
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

