通过一定的长度和值组合增长向量

Grow vector by certain length and value combinations

我有这个向量:

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_seqend_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,同时都在同一个向量中。

有什么快速的方法吗? (这是一个简单的例子,序列数可以更高)。值得一提的是,所有 "previous" 序列的长度都相同(在这种情况下,3)并且它们至少被两个值分隔(不会发生 6,7,8,9,10,11 这样的情况)。我知道我可以用循环来做到这一点,但速度是一个因素。

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

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

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

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