2017-03-15 5 views
0

ベクトルをリストに分割して、すべての連続する一意の値を1つのグループに入れる方法があるかどうかを確認しようとしています。連続した一意の値に基づいてベクトルをリストに分割する方法

この方法は、xも文字であるときに機能することに注意してください。ここで

#DATA 
x = c(0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7) 
x 
#[1] 0 0 0 7 7 7 7 0 0 0 0 0 0 0 7 7 7 7 

#DESIRED OUTPUT 
L = list(c(0, 0, 0), c(7, 7, 7, 7), c(0, 0, 0, 0, 0, 0, 0), c(7, 7, 7, 7)) 
L 
#[[1]] 
#[1] 0 0 0 

#[[2]] 
#[1] 7 7 7 7 

#[[3]] 
#[1] 0 0 0 0 0 0 0 

#[[4]] 
#[1] 7 7 7 7 

#CURRENT APPROACH 
split_vector = 0 
for (i in 2:length(x)){ 
    split_vector[i] = ifelse(x[i] != x[i-1], max(split_vector) + 1, split_vector[i-1]) 
} 
split(x, split_vector) 
#$`0` 
#[1] 0 0 0 

#$`1` 
#[1] 7 7 7 7 

#$`2` 
#[1] 0 0 0 0 0 0 0 

#$`3` 
#[1] 7 7 7 7 

答えて

3
tapply(x, cumsum(c(TRUE, diff(x) != 0)), identity) 

$`1` 
[1] 0 0 0 

$`2` 
[1] 7 7 7 7 

$`3` 
[1] 0 0 0 0 0 0 0 

$`4` 
[1] 7 7 7 7 

# Character example 
x <- rep(c("a", "b", "c", "a"), c(4, 3, 2, 4)) 
x 

[1] "a" "a" "a" "a" "b" "b" "b" "c" "c" "a" "a" "a" "a" 

# Character version 
tapply(x, cumsum(c(TRUE, x[-1] != x[-length(x)])), identity) 

$`1` 
[1] "a" "a" "a" "a" 

$`2` 
[1] "b" "b" "b" 

$`3` 
[1] "c" "c" 

$`4` 
[1] "a" "a" "a" "a" 
+1

。文字については、 'tapply(x、cumsum(c、TRUE、diff)as.numeric(as.factor(x)))!= 0))、I)'が動作します。 –

+1

更新されたものを見てください。 – JasonWang

5

いくつかの選択肢があります:

1)rep利用rleその上のグループ化ベクトルとスプリットを形成します。パッケージは使用されません。

split(x, with(rle(x), rep(seq_along(values), lengths))) 

与える:

$`1` 
[1] 0 0 0 

$`2` 
[1] 7 7 7 7 

$`3` 
[1] 0 0 0 0 0 0 0 

$`4` 
[1] 7 7 7 7 

2) data.tableパッケージからrleidを使用してそれがさらに簡単です:クール

library(data.table) 
split(x, rleid(x)) 
関連する問題