2014-09-11 11 views
10

Następujący wektor x zawiera dwie sekwencje 1:4 i 6:7, spośród innych niesekwencyjnych cyfr.Podziel wektor według sekwencji

x <- c(7, 1:4, 6:7, 9) 

Chciałbym podzielić x przez jego sekwencji, tak że wynik jest lista jak poniżej.

# [[1]] 
# [1] 7 
# 
# [[2]] 
# [1] 1 2 3 4 
# 
# [[3]] 
# [1] 6 7 
# 
# [[4]] 
# [1] 9 

Czy istnieje szybki i prosty sposób na zrobienie tego?

Próbowałem

split(x, c(0, diff(x))) 

który zbliża, ale nie czuję się jak dołączanie 0 do differenced wektorem jest właściwa droga. Używanie findInterval również nie działa.

Odpowiedz

15
split(x, cumsum(c(TRUE, diff(x)!=1))) 
#$`1` 
#[1] 7 
# 
#$`2` 
#[1] 1 2 3 4 
# 
#$`3` 
#[1] 6 7 
# 
#$`4` 
#[1] 9 
1

Tak dla zabawy, można skorzystać z funkcji Carl Witthoft'sseqle z jego "cgwtools" package. (To nie będzie tak efektywne jak odpowiedź Rolanda.)

library(cgwtools) 

## Here's what seqle does... 
## It's 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