R:将向量拆分为等长的重叠子向量
R: Split a vector to overlapping subvectors of equal length
假设我有一个向量 1 到 10,并希望将其拆分为以下两个条件的子向量:
等长 3.
重叠 1.
我得到了一个几乎完成的答案 Split vector with overlapping samples in R,其中包含我在下面修改的函数:
splitWithOverlap <- function(vec, seg.length, overlap) {
starts = seq(1, length(vec), by=seg.length-overlap)
ends = starts + seg.length - 1
ends[ends > length(vec)] = length(vec)
lapply(1:length(starts), function(i) vec[starts[i]:ends[i]])
}
splitWithOverlap(1:10, 3, 2)
产生了
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
#[[9]]
#[1] 9 10
#[[10]]
#[1] 10
我要的是
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
因为这两个条件都达到了,从数学上来说,number of blocks = vector length - subvector length + 1
(10 - 3 + 1
) = 8 而不是 10
我想修改函数,使其在子向量 8 处停止。
这是一个选项 embed
生成 matrix
然后按行拆分 asplit
n <- 3
n1 <- length(v1)
asplit(embed(c(v1, v1), n)[seq_len(n1- n+1), n:1], 1)
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
数据
v1 <- 1:10
数据
len = 3
ov = 1
vec = 1:10
1
lapply(1:(length(vec) - (len - ov)), function(i){
vec[i:(i + len - ov)]
})
2
ind = rep(1:len, length(vec) - (len - ov))
matrix(vec[ind + ave(ind, ind, FUN = seq_along) - 1], ncol = len, byrow = TRUE)
假设我有一个向量 1 到 10,并希望将其拆分为以下两个条件的子向量:
等长 3.
重叠 1.
我得到了一个几乎完成的答案 Split vector with overlapping samples in R,其中包含我在下面修改的函数:
splitWithOverlap <- function(vec, seg.length, overlap) {
starts = seq(1, length(vec), by=seg.length-overlap)
ends = starts + seg.length - 1
ends[ends > length(vec)] = length(vec)
lapply(1:length(starts), function(i) vec[starts[i]:ends[i]])
}
splitWithOverlap(1:10, 3, 2)
产生了
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
#[[9]]
#[1] 9 10
#[[10]]
#[1] 10
我要的是
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
因为这两个条件都达到了,从数学上来说,number of blocks = vector length - subvector length + 1
(10 - 3 + 1
) = 8 而不是 10
我想修改函数,使其在子向量 8 处停止。
这是一个选项 embed
生成 matrix
然后按行拆分 asplit
n <- 3
n1 <- length(v1)
asplit(embed(c(v1, v1), n)[seq_len(n1- n+1), n:1], 1)
#[[1]]
#[1] 1 2 3
#[[2]]
#[1] 2 3 4
#[[3]]
#[1] 3 4 5
#[[4]]
#[1] 4 5 6
#[[5]]
#[1] 5 6 7
#[[6]]
#[1] 6 7 8
#[[7]]
#[1] 7 8 9
#[[8]]
#[1] 8 9 10
数据
v1 <- 1:10
数据
len = 3
ov = 1
vec = 1:10
1
lapply(1:(length(vec) - (len - ov)), function(i){
vec[i:(i + len - ov)]
})
2
ind = rep(1:len, length(vec) - (len - ov))
matrix(vec[ind + ave(ind, ind, FUN = seq_along) - 1], ncol = len, byrow = TRUE)