6

ベクトルの特定のサブセットに基づいてサブセットを保存したい非常に大きなデータフレームがあります。要するに私はこのようなものを持っています:

> id<-c("ID1","ID2","ID2","ID3","ID4","ID4","ID4","ID4","ID4")
> status<-c("flag","flag","none","none","flag","flag","flag","none","flag")
> misc1ofmany<-c("etc1","etc2","etc3","etc4","etc5","etc6","etc7","etc8","etc9")
> df = data.frame(id, status, misc1ofmany) ; df
   id status misc1ofmany
1 ID1   flag        etc1
2 ID2   flag        etc2
3 ID2   none        etc3
4 ID3   none        etc4
5 ID4   flag        etc5
6 ID4   flag        etc6
7 ID4   flag        etc7
8 ID4   none        etc8
9 ID4   flag        etc9

フラグが立てられていないセッションを含め、フラグが立てられているIDのすべての行が必要です。現在、grepを使用して他のIDのインデックスを取得し、それを新しいdfにプラグインしようとしています。実際、私がこれを書いたとき、私はgreplがより扱いやすいかもしれないことを理解しました:

> flaggedIDs <- unique(as.vector(df$id[grep("flag",df$status)]))
> flaggedIDs.allStats.Index <- mapply(grepl,df$id,MoreArgs=list(x=flaggedIDs)) 
> flaggedIDs.allStats.Index
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]
[1,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

しかし、私はここに行きたいだけです:

> flaggedIDsdf <- df[flaggedIDs.allStats.Index] ; flaggedIDsdf
   id status misc1ofmany
1 ID1   flag        etc1
2 ID2   flag        etc2
3 ID2   none        etc3
4 ID4   flag        etc5
5 ID4   flag        etc6
6 ID4   flag        etc7
7 ID4   none        etc8
8 ID4   flag        etc9

私はこれを私が考えているよりも単純なはずだと感じていますが、私はこれを理解するために多くの可能性を試しましたが無駄になりました。質問を書くことは、これが私の頭の中でより明確で単純な問題になるのを助けました(私は今一歩を逃しているように見えます)が、今私はこれを行うためのより効率的な方法があるかどうか疑問に思っています。

4

3 に答える 3

6

data.tableエレガントな構文とメモリ効率のため、ここでは本当に便利です

library(data.table)

DT <- data.table(df)

setkey(DT, 'id')

DT[DT[status=='flag', list(id = unique(id))]]

    id status misc1ofmany
1: ID1   flag        etc1
2: ID2   flag        etc2
3: ID2   none        etc3
4: ID4   flag        etc5
5: ID4   flag        etc6
6: ID4   flag        etc7
7: ID4   none        etc8
8: ID4   flag        etc9

またはさらにコンパクトに

DT[J(unique(id[status=='flag']))]

上記の2つのアプローチは、iコンポーネントが最初にによって評価されるという事実を使用していますdata.table。キーイングidとは、自己結合を実行して、が存在するものだけを抽出できることを意味しidsますstatus=='flag


または、by

DT[,if(any(status=='flag')){.SD} ,by=id]

DTこれは、 byのサブセットを通過し、 (そのサブセット内の)if(サブセットのdata.table)idを返します。.SDany(status=='flag')

于 2012-11-29T00:50:26.177 に答える
2

これはうまくいくようです:

df[df$id %in% df$id[df$status == "flag"],]

平易な英語:データフレームから、id要素が任意の行でステータスがフラグ付けされているid要素のベクトルにある各行を選択します。

于 2012-11-29T00:50:03.900 に答える
1

あなたがやろうとしていることは一行で処理できると思います

df[which(df$id %in% df$id[df$status=="flag"]), ]

結果:

   id status misc1ofmany
1 ID1   flag        etc1
2 ID2   flag        etc2
3 ID2   none        etc3
5 ID4   flag        etc5
6 ID4   flag        etc6
7 ID4   flag        etc7
8 ID4   none        etc8
9 ID4   flag        etc9
于 2012-11-29T00:43:06.217 に答える