2017-03-27 4 views
1

以前は、データテーブルを使用して2行に1つの後続行に1つのIDをグループ化したIDを選択する方法の問題を解決しました。data.tableを使用した前回の照会までの拡張

df2 <- data.frame(id=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3), 
     num=c(1,2,1,1,2,1,1,1,2,2,1,1,1,2,2)) 
df2$id <- as.factor(df2$id) 

ソリューションでした

library(data.table) 
setDT(df2) 
df2[, Position(I,num==2) < Position(I,num < 2,right=TRUE,nomatch=FALSE), by=id] 

が続いている2の値が含まれている(またはそのインデックス)実際の行を選択するdata.tableを使用しての方法があります場合、私は今疑問に思って1の場合、ID番号を返す上記のソリューションの代わりに、このような注文が存在します。

ありがとうございました。

+0

前の質問へのリンク - http://stackoverflow.com/que stions/42012667/find-any-values-of-the-first-of-a値のより小さい – thelatemail

答えて

2

これは、行インデックス(.I)を取得することによって行うことができ、その後、OPの発言に基づいて

df2[df2[, .I[Position(I,num==2) < Position(I,num < 2,right=TRUE,nomatch=FALSE)], by=id]$V1] 

それに基づいてサブセット私の最初の考えはどこ条件「のidのために行を取得することでしたPositionに基づく。したがって、この場合には、全体の行は、ID 『『それぞれについて、』2『我々はのインデックスをしたい場合1は、2


をたどるであろうが』NUMたもの「の値を持っているのidの』の返されますこれは、我々はそれ以降の値が、特定の「ID」

のための最初の「2」の値に従って任意の値だけでなく、をチェックしたいならば、我々は

setDT(df2)[, .I[num==2 & shift(num, type = "lead", fill=0)==1], id]$V1 
#[1] 2 10 

とを使用することができ、「1」が続いています

setDT(df2)[, {i1 <- which(num==2)[1]; if(any(num[pmin(i1+1, .N):.N]==1)) .I[i1] } , id]$V1 
#[1] 2 10 
+0

これは私が意味していたexaltyではありません。私が意味していたのは、私はグループ内の1に続く2の値のインデックスを返すことでした。だからdf2ではインデックス2と10を返したいと思っています。 – user85727

+0

@ user85727投稿内のあなたのステートメントは '実際の行を選択するためにdata.tableを使用する方法があれば今や不思議です' – akrun

+0

はい、実際の行を選択するには1の前に2となる性質を満たすか、等価的にそれらの指数を得る。 – user85727

関連する問題