Ответ 1
split(x, cumsum(c(TRUE, diff(x)!=1)))
#$`1`
#[1] 7
#
#$`2`
#[1] 1 2 3 4
#
#$`3`
#[1] 6 7
#
#$`4`
#[1] 9
Следующий вектор x
содержит две последовательности 1:4
и 6:7
, среди других несекретных цифр.
x <- c(7, 1:4, 6:7, 9)
Я хотел бы разделить x
на его последовательности, так что результатом будет список вроде следующего.
# [[1]]
# [1] 7
#
# [[2]]
# [1] 1 2 3 4
#
# [[3]]
# [1] 6 7
#
# [[4]]
# [1] 9
Есть ли быстрый и простой способ сделать это?
Я пробовал
split(x, c(0, diff(x)))
который приближается, но я не чувствую, что добавление 0
к разностному вектору - это правильный путь. Использование findInterval
тоже не сработало.
split(x, cumsum(c(TRUE, diff(x)!=1)))
#$`1`
#[1] 7
#
#$`2`
#[1] 1 2 3 4
#
#$`3`
#[1] 6 7
#
#$`4`
#[1] 9
Просто для удовольствия вы можете использовать функцию seqle
от Carl Witthoft пакет "cgwtools" . (Это будет не так удобно, как ответ Roland.)
library(cgwtools)
## Here what seqle does...
## It like rle, but for sequences
seqle(x)
# Run Length Encoding
# lengths: int [1:4] 1 4 2 1
# values : num [1:4] 7 1 6 9
y <- seqle(x)
split(x, rep(seq_along(y$lengths), y$lengths))
# $`1`
# [1] 7
#
# $`2`
# [1] 1 2 3 4
#
# $`3`
# [1] 6 7
#
# $`4`
# [1] 9