2016-12-23 4 views
0

私は数が少ないと仮定し、私はどのように私はクリティカルな数以下の連続する値を見つけることができますか?たとえば、Mydataでは、単一の値< 10の場合、それらを見つけます。連続する値が<の場合、合計を求めます。クリティカルナンバー以下の連続する値を選択する方法は?

Mydata = c(-10,11,-100,-8,-6,-5,15,10,22,-8.5,88,76.5,42,-85,9,100) 
which(Mydata<10) 
[1] 1 3 4 5 6 10 14 15 

3,4,5,6,14,15は連続した数字であり、1,10は単一の数字であることがわかります。最終的な結果は

-10,-119,-8.5,-76 

です。Rでこれを行う方法がわかります。ありがとう。

+0

からrleidとオプションで、これは宿題の問題ですか?これは、非常に特殊な要件のようです。特定のアプリケーションを念頭に置いていますか? –

+0

いいえ、これは宿題の問題ではなく、私の研究に関連しています。ありがとう。 –

答えて

3

いいえ、その場合、次のトリックを使用できます。 diffをインデックスに適用すると、インデックスのペアが連続している場合は値1、連続する値の新しいブロックが開始されるたびに非1の値が返されます。それらのブロック開始を論理ベクトルで識別し、それに沿ってブロック番号のベクトルを生成するためにcumsumを実行することができます。その後、tapplyはあなたのための合計を計算することができます。ここでは

consecutive.below <- function(x, threshold) { 
    o <- which(x < threshold) 
    if (length(o)==0) return(x[o]) 
    blocks <- cumsum(c(TRUE, diff(o) != 1)) 
    unname(tapply(x[o], blocks, sum)) 
} 
consecutive.below(Mydata, 10) 
0

data.table

library(data.table) 
i1 <- Mydata < 10 
as.vector(tapply(Mydata*i1, rleid(i1)*i1, FUN = sum)[-1]) 
#[1] -10.0 -119.0 -8.5 -76.0 
関連する問題