This question already has answers here:
Filter groups by occurrence of a value

(2个答案)


2年前关闭。




如果我有以下data.table

matchID characterID信息
1111 4 abc
1111 12防御
1111 1吉
2222 8 jkl
2222 7 mno
2222 3 pwr
3333 9 abc
3333 2吉
33333 4公斤

我想对其进行子集化以查找特定的characterID,但返回与characterID相关联的每个matchID。例如,如果我查询characterID = 12,则应获取以下数据集:

matchID characterID信息
1111 4 abc
1111 12防御
1111 1吉

该data.table子集是什么样的?我专门在寻找某种形式为datatable [characterID = 12,1:3,Info]的形式。

最佳答案

我们创建一个函数来获取与“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]

08-25 06:36