2012-04-16 13 views
1

シーケンスの終了と開始を見たい長いデータフレームがあります。私が好きな何data.frameでシーケンスの開始と終了を見つける

b = c("a","c","a","c","e", "a","c","a","c","a" ,"c","a","c","a","c" ,"d","d","d","d","d") 
a = c(0,0,0,0,1, 4,0,0,0,0, 5,1,6,0,0, 0,10,0,0,0) 
df = data.frame(a,b) 

を簡素化するためには、非ゼロの遷移に0、0にすべての非ゼロを見つけるための方法です。

これは、lapplyを使用して、関数を呼び出して以前の呼び出しの値を保存することで行いました。

私は、行Nと行N + 1、またはより良いまだ行Nと行N + Mを私の機能や何かで見てみましょうよりエレガントなものを探しています。

+2

'rle(Data $ a == 0) 'で見つけることができますが、最終目標に応じてシーケンスをグループ化するより便利な方法があるかもしれません。 –

+0

Joshuaのコメントを詳しく述べると、 'Data $ a == 0'は0の場合論理1を返し、それ以外の場合は論理0を返し、' rle'の出力をあなたが望むものにします。 –

答えて

0

これはおそらくあなたが望むものですか?エレガントではないかもしれませんが、記述したトランジションを検出する必要があります。

> lagn <- function(x, n) { c(rep(NA,n), x[1:(length(x)-n)]) } 
> df$c <- lagn(df$a, 1) 
# mult ensures one of the item is zero, add ensures one of the item was nonzero 
> df[which((df$a*df$c)==0 & (df$a+df$c)!=0),] 
    a b c 
5 1 e 0 
7 0 c 4 
11 5 c 0 
14 0 a 6 
17 10 d 0 
18 0 d 10 
関連する問題