过滤一个data.table让每一个子集,是每个数据块的选择,而不是排

问题描述:

如果我有以下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]'但是我觉得这不是'数据。桌子'做它的方式。 –

我们创建一个函数来获取数据集与相匹配的子集“或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