【问题标题】:R: Split a vector to overlapping subvectors of equal lengthR:将向量拆分为等长的重叠子向量
【发布时间】:2019-10-09 16:51:30
【问题描述】:

假设我有一个 1 到 10 的向量,并希望将其拆分为以下两个条件的子向量:

  1. 长度为 3。

  2. 重叠为 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 处停止。

【问题讨论】:

    标签: r split overlap


    【解决方案1】:

    数据

    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)
    

    【讨论】:

      【解决方案2】:

      这里有一个使用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
      

      【讨论】:

      • 同样,n &lt;- 3; v1 &lt;- 1:10; m &lt;- length(v1) - n + 1; split(t(embed(v1, m))[m:1,], 1:m)
      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2013-08-26
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多