【问题标题】:Grow vector by certain length and value combinations按特定长度和值组合增长向量
【发布时间】:2020-01-20 07:40:24
【问题描述】:

我有这个向量:

a = c(4,5,6,81,82,83)  

我想要的结果如下:

b = c(1,2,3,4,5,6,78,79,80,81,82,83)

我的逻辑是:a 中有两个不同的序列(这可以使用length(which(diff(a)>1))+1 来检查)。它们中的每一个都必须从后面延伸到1:end_of_first_seq (end_of_first_seq = a[which(diff(a)>1))[1]) 的长度。因此,在这种情况下,每个序列的长度应该是6。因此,每个序列必须落后三步,所以4,5,6 变为1,2,3,4,5,6 并且81,82,83 变为78,79,80,81,82,83,同时它们都在同一个向量中。

有什么快速的方法吗? (这是一个简单的例子,序列的数量可以更高)。值得一提的是,所有“先前”序列的长度相同(在本例中为3),并且它们至少由两个值分隔(不会发生6,7,8,9,10,11 之类的情况)。我知道我可以通过循环来做到这一点,但速度是一个因素。

【问题讨论】:

  • 所以每个序列的长度必须为 6,因为 length(1:end_of_first_sequence)6。如果有一个长度超过 6 的序列怎么办。所以在这个例子中如果a = c(4,5,6,81,82,83,84,85,86,87)。 87会被删除吗?
  • 好问题,但正如我所写,所有“先前”序列的长度都相同。此外,两个“prev”序列由至少 2 个值分隔。我会将其添加到原始问题中。

标签: r vector sequence


【解决方案1】:

如果所有序列的长度相同:

vec <- c(4,5,6,81,82,83)  

LEN <- 3 # sequence length

want <- matrix(vec, ncol = LEN, byrow = TRUE)
want <- cbind(want - LEN, want)
want <- as.vector(t(want))
want
# [1]  1  2  3  4  5  6 78 79 80 81 82 83

【讨论】:

    【解决方案2】:

    我们计算每个序列的长度,由于所有序列的长度相同,我们可以提取每个 nth 值并在每个序列的两点之间创建一个序列。

    length_of_each_seq <- a[which.max(diff(a)>1)]
    n <- 3
    
    vals <- a[seq(n, length(a), by = n)]
    c(mapply(`:`, vals - (length_of_each_seq - 1), vals))
    #[1]  1  2  3  4  5  6 78 79 80 81 82 83
    

    vals 是序列的结尾

    vals
    #[1]  6 83
    

    vals - (length_of_each_seq - 1) 是我们需要开始的地方

    vals - (length_of_each_seq - 1)
    #[1]  1 78
    

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2016-09-07
      • 2021-12-13
      • 2019-05-22
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多