2012-11-29 73 views
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 

我覺得這不是我應該更簡單我是這樣做的,但是我已經嘗試了很多可能性來解決這個問題無濟於事。寫出這個問題幫助我成爲了一個更清晰/更簡單的問題(看起來我現在只是缺少一個步驟),但現在我也想知道是否有更有效的方法來解決這個問題。

回答

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']))] 

上面使用這兩種方法的事實i組件由data.table首先評估。 鍵值id表示我們可以通過自聯接來提取那些ids,其中status=='flag


或者,使用by

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

這由id經過的DT的子集,並返回.SD(子集的data.table)如果any(status=='flag')(該子集內)。

+0

很優雅!謝謝你的回答! – stites

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 
+0

他似乎想保持ID和行,只要它被標記。這隻會保留那些被標記的。 –

+0

@Brandon Woops!謝謝澄清,我修改 –

2

這似乎工作:

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

純英文:從在數據框中,選擇其id元素在任何行中標記狀態的id元素的向量中的每一行。