通过一定的长度和值组合增长向量
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_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
,同时都在同一个向量中。
有什么快速的方法吗? (这是一个简单的例子,序列数可以更高)。值得一提的是,所有 "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
我有这个向量:
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
,同时都在同一个向量中。
有什么快速的方法吗? (这是一个简单的例子,序列数可以更高)。值得一提的是,所有 "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