2014-09-11 30 views
10

vektörü aşağıdaki x iki dizi 1:4 ve 6:7 içeren bir vektör, diğer ardışık olmayan rakamlar arasında.Bölünmüş onun dizileri

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

sonucun aşağıdaki gibi bir liste olacak şekilde, kendi dizileri ile x bölmek istiyorum.

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

Bunu yapmanın hızlı ve basit bir yolu var mı?

Ben yakın alır

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

denedim ama farklılaştırlmış vektöre 0 ekleme gibi hissetmiyorum gitmek doğru yoldur. findInterval kullanmak da işe yaramadı.

cevap

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

Sadece eğlence için, onun "cgwtools" package den Carl Witthoft'sseqle fonksiyonun yararlanabilir. (Roland'ın cevabı kadar verimli bir yerde olmayacak.)

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