2016-05-20 5 views
3

次のdata.frameがあるとします。ここで、posは位置座標です。私はvalが所定のしきい値tより大きい変数threshを含んでいます。条件に基づいてdata.frameを分割する

0.3 - 1.2, 
1.8 - 3.9, 
4.5 - 4.5, 
5.7 - 5.7 

私は脱穀によってdata.frameを分割を考えた後、最初と最後からのposにアクセスしている:私はvalは、上記の例では、すなわち正の場合の領域が座標得ることができますどのように

set.seed(123) 
n <- 20 
t <- 0 
DF <- data.frame(pos = seq(from = 0, by = 0.3, length.out = n), 
       val = sample(-2:5, size = n, replace = TRUE)) 
DF$thresh <- DF$val > t 
DF 

## pos val thresh 
## 1 0.0 0 FALSE 
## 2 0.3 4 TRUE 
## 3 0.6 1 TRUE 
## 4 0.9 5 TRUE 
## 5 1.2 5 TRUE 
## 6 1.5 -2 FALSE 
## 7 1.8 2 TRUE 
## 8 2.1 5 TRUE 
## 9 2.4 2 TRUE 
## 10 2.7 1 TRUE 
## 11 3.0 5 TRUE 
## 12 3.3 1 TRUE 
## 13 3.6 3 TRUE 
## 14 3.9 2 TRUE 
## 15 4.2 -2 FALSE 
## 16 4.5 5 TRUE 
## 17 4.8 -1 FALSE 
## 18 5.1 -2 FALSE 
## 19 5.4 0 FALSE 
## 20 5.7 5 TRUE 

各data.frameリスト要素の1行だけですが、TRUEとFALSEの部分集合をまとめて組み合わせるだけです。 TRUE値に基づいて文字にthresh変数を変換し、FALSE値を破棄する方法はありますか?

split(DF, DF$thresh) # not what I want 


## $`FALSE` 
## pos val thresh 
## 1 0.0 0 FALSE 
## 6 1.5 -2 FALSE 
## 15 4.2 -2 FALSE 
## 17 4.8 -1 FALSE 
## 18 5.1 -2 FALSE 
## 19 5.4 0 FALSE 
## 
## $`TRUE` 
## pos val thresh 
## 2 0.3 4 TRUE 
## 3 0.6 1 TRUE 
## 4 0.9 5 TRUE 
## 5 1.2 5 TRUE 
## 7 1.8 2 TRUE 
## 8 2.1 5 TRUE 
## 9 2.4 2 TRUE 
## 10 2.7 1 TRUE 
## 11 3.0 5 TRUE 
## 12 3.3 1 TRUE 
## 13 3.6 3 TRUE 
## 14 3.9 2 TRUE 
## 16 4.5 5 TRUE 
## 20 5.7 5 TRUE 

私が試したもう一つの不格好なものでしたcumsumが、再び、それは偽の行が含まれています

split(DF, cumsum(DF$thresh == 0)) # not what I want but close to it... 


## $`1` 
## pos val thresh 
## 1 0.0 0 FALSE 
## 2 0.3 4 TRUE 
## 3 0.6 1 TRUE 
## 4 0.9 5 TRUE 
## 5 1.2 5 TRUE 
## 
## $`2` 
## pos val thresh 
## 6 1.5 -2 FALSE 
## 7 1.8 2 TRUE 
## 8 2.1 5 TRUE 
## 9 2.4 2 TRUE 
## 10 2.7 1 TRUE 
## 11 3.0 5 TRUE 
## 12 3.3 1 TRUE 
## 13 3.6 3 TRUE 
## 14 3.9 2 TRUE 
## 
## $`3` 
## pos val thresh 
## 15 4.2 -2 FALSE 
## 16 4.5 5 TRUE 
## 
## $`4` 
## pos val thresh 
## 17 4.8 -1 FALSE 
## 
## $`5` 
## pos val thresh 
## 18 5.1 -2 FALSE 
## 
## $`6` 
## pos val thresh 
## 19 5.4 0 FALSE 
## 20 5.7 5 TRUE 
+0

splitコマンドで問題はありません。とにかく、分割するのではなく、単にDF [DF $ thresh == T、] 'に行かないのはなぜですか? –

+0

@AdamQuekこれは、すべてのTRUE行をまとめて組み合わせることになりますが、正確な '地域'にアクセスしたいからです。あなたの道を行くことは、私に0.3 - 5.7の限界を与えるだろう... – PeterQ

答えて

6

ここdata.tableを持つ一つの選択肢です。 rleidを使用してグループ化変数を作成し、 'thresh'に基づいて 'pos'をサブセットとし、splitをサブセット化します。

DT <- setDT(DF)[,pos[thresh] ,.(gr=rleid(thresh))] 
split(DT$V1, DT$gr) 
#$`2` 
#[1] 0.3 0.6 0.9 1.2 

#$`4` 
#[1] 1.8 2.1 2.4 2.7 3.0 3.3 3.6 3.9 

#$`6` 
#[1] 4.5 

#$`8` 
#[1] 5.7 

それとも我々は、グループ化変数を作成するbase Rからrleを使用することができ、その後、splitその

gr <- inverse.rle(within.list(rle(DF$thresh), values <- seq_along(values))) 
with(DF, split(pos[thresh], gr[thresh])) 

に基づいそれとも@thelatemailが述べたように、cumsumもサブセット化した後、グループ化に使用することができます'thresh'を使用します。

with(DF, split(pos[thresh],cumsum(!thresh)[thresh])) 
+1

それは素晴らしいです。これらの日のdata.tableを学ばなければなりません...おそらくベースR代替もありますか? – PeterQ

+3

代替 - 'split(DF $ pos [DF $ thresh]、cumsum(!DF $ thresh)[DF $ thresh])' – thelatemail

+1

@thelatemailこれは素晴らしいオプションです。あなたはそれを投稿している可能性があります。 – akrun

関連する問題