过滤data.table,以便每个子集都是选定的数据块而不是行

时间:2017-10-05 06:06:20

标签: r 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

我想将其子集化以查找特定的characterID,但返回与characterID关联的每个matchID。例如,如果我查询characterID = 12,我应该得到这个数据集:

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

data.table子集是什么样的?我特意寻找 datatable [characterID = 12,1:3,Info]形式的东西。

1 个答案:

答案 0 :(得分:3)

我们创建一个函数来获取与' characterID匹配的数据集子集'

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

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

我们可以单独传递ID&#39; ID&#39;或filter行的多个ID

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]