Выращивать вектор по определенной комбинации длины и значения - PullRequest
1 голос
/ 19 сентября 2019

У меня есть этот вектор:

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, не может иметь место).Я знаю, что могу сделать это с помощью петель, но скорость - это фактор.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Если все последовательности имеют одинаковую длину:

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 голосов
/ 19 сентября 2019

Мы вычисляем длину каждой последовательности и, поскольку все последовательности имеют одинаковую длину, мы можем извлечь каждое 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
...