将父向量拆分为具有相等 seb 向量长度的重叠子向量,R 中的最后一个子向量除外

Split a Parent Vector to Overlapping Sub-vectors with Equal seb-vectors Length Except the Last Sub-vector in R

我想将父向量拆分为等长的子向量和重叠的 suvectors,这样如果存在假定的最后一个向量,该向量不会使指定的子向量长度与其倒数第二个合并。这个问题是@rawr 评论 HERE

的跟进
########Block function######################
blocks <- function(len, ov, n) {

  starts <- unique(sort(c(seq(1, n, len), seq(len-ov+1, n, len))))
  ends <- pmin(starts + len - 1, n)

  # truncate starts and ends to the first num elements
  num <- match(n, ends)
  head(data.frame(starts, ends), num)
}

########Moving block#############
vec = 1:17
len = 8
ov = ceiling(len/2)
b <- blocks(len, ov, length(vec))
with(b, Map(function(i, j) vec[i:j], starts, ends))

1 1 2 3 4 5 6 7 8

[2] 5 6 7 8 9 10 11 12

[3] 9 10 11 12 13 14 15 16

[4] 13 14 15 16 17

我想要什么

我想像这样将最后一个不符合指定子向量的列表合并到倒数第二个列表:

1 1 2 3 4 5 6 7 8

[2] 5 6 7 8 9 10 11 12

[3] 9 10 11 12 13 14 15 16 13 14 15 16 17

我们可以创建条件 if

out <- with(b, Map(function(i, j) vec[i:j], starts, ends))
l1 <- length(out)
if(length(out[[l1]]) < len) {
    out[[l1-1]] <- unlist(out[(l1-1):l1])
    out[[l1]] <- NULL
}

-输出

out
[[1]]
[1] 1 2 3 4 5 6 7 8

[[2]]
[1]  5  6  7  8  9 10 11 12

[[3]]
 [1]  9 10 11 12 13 14 15 16 13 14 15 16 17