2017-10-05 22 views
3

如果我有以下data.table過濾一個data.table讓每一個子集,是每個數據塊的選擇,而不是排

 
matchID characterID info 
1111 4   abc 
1111 12   def 
1111 1   ghi 
2222 8   jkl 
2222 7   mno 
2222 3   pwr 
3333 9   abc 
3333 2   ghi 
33333 4   jkl 

我想子集它來尋找特定characterIDs,但回報每一位matchID與characterID相關聯。例如,如果我查詢characterID = 12,我應該得到這個數據集:

 
matchID characterID info 
1111  4   abc 
1111  12   def 
1111  1   ghi 

什麼data.table子集看起來像?我正在尋找數據表 [characterID = 12,1:3,Info]的形式。

+1

'DF [DF $ matchID%的DF%$ matchID [DF $ ==或CharacterId 12]'但是我覺得這不是'數據。桌子'做它的方式。 –

回答

3

我們創建一個函數來獲取數據集與相匹配的子集「或CharacterId」

library(dplyr) 
f1 <- function(dat, charIDs) { 

     dat %>% 
      group_by(matchID) %>% 
      filter(all(charIDs %in% characterID)) 
    } 

我們可以爲單一的「ID」或多個ID傳遞給filter

f1(df1, 12) 
# A tibble: 3 x 3 
# Groups: matchID [1] 
# matchID characterID info 
# <int>  <int> <chr> 
#1 1111   4 abc 
#2 1111   12 def 
#3 1111   1 ghi 

f1(df1, c(7, 3)) 
# A tibble: 3 x 3 
# Groups: matchID [1] 
# matchID characterID info 
# <int>  <int> <chr> 
#1 2222   8 jkl 
#2 2222   7 mno 
#3 2222   3 pwr 

我們也可以使用data.table選項

library(data.table) 
setDT(df1)[ , if(all(12 %in% characterID)) .SD, matchID] 

或者

setDT(df1)[ , .SD[all(12 %in% characterID)], matchID] 

或者

setDT(df1)[df1[ , .I[all(12 %in% characterID)], matchID]$V1] 
+1

最後三個是我在找的,謝謝。這三者之間的計算複雜度是否有差異? – Alex

+0

@Alex'.I'會更快 – akrun

+0

自加入似乎也可以完成合並(Y [characterID == 12,「matchID」],Y,by =「matchID」) – ashleych

相關問題