2014-09-11 11 views
10

Các vector sau x chứa hai chuỗi 1:46:7, trong số các chữ số không tuần tự khác.Tách một vector theo các dãy của nó

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

Tôi muốn tách x theo trình tự của nó, để kết quả là danh sách như sau.

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

Có cách nào đơn giản và nhanh chóng để thực hiện việc này không?

Tôi đã thử

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

mà được gần gũi, nhưng tôi không cảm thấy như phụ 0 vào vector differenced là đúng cách để đi. Sử dụng findInterval cũng không hoạt động.

Trả lời

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

Just for fun, bạn có thể tận dụng Carl Witthoft'sseqle chức năng từ "cgwtools" package mình. (Nó sẽ không ở bất cứ nơi nào gần như hiệu quả như câu trả lời của Roland.)

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 
Các vấn đề liên quan