如何从data.frame中选择具有3个“动态”条件的行来自其他表?

时间:2016-07-25 21:14:50

标签: r dplyr

所以这是我的名为qb的表:

GameID Qtr      Drive   Down  Passer

1      1        1       1     A
1      1        2       1     A
1      1        2       2     A
1      1        2       3     A

这是第二个名为sacks的表,我想用它来过滤

gameId Qtr      Drive   Down  Sack

1      1        2       2     yes
1      1        2       3     yes

我尝试过滤QB表的行,其中gameID,Drive和Down与sacks表中的相同。

GameID Qtr      Drive   Down  Passer

1      1        2       2     A
1      1        2       3     A

我尝试了dplyrqb %>% filter(Drive == sacks$Drive & Down==sacks$Down & gameID==sacks$gameID),但它不起作用。我可以使用merge但是寻找一些“过滤器解决方案”(我的例子比我想要处理的更简单)。我也收到了奇怪的警告

In addition: Warning messages:
1: In c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,  :
  longer object length is not a multiple of shorter object length
2: In c(NA, 1, 1, 2, 1, 1, 1, 2, 2, 3, 4, 1, 1, 1, 1, 2, 3, 4, 1, 2,  :
  longer object length is not a multiple of shorter object length
编辑:我认为我过分复杂了我的问题。我会再试一次。我有表格qb,如示例和第二个表格,其中我有2列:gameID和Drive。作为我的最终结果,我希望看到GameID = gameID和Drive = Drive

的所有行

2 个答案:

答案 0 :(得分:1)

您可以使用基本子集:

qb[qb$GameID == sacks$gameId &
       qb$Drive == sacks$Drive &
       qb$Down == sacks$Down,]
#  GameID Qtr Drive Down Passer
#3      1   1     2    2      A
#4      1   1     2    3      A

答案 1 :(得分:1)

dplyr::semi_join就是为此而建的:

library(dplyr)

semi_join(qb, sacks %>% rename(GameID = gameId))
##   GameID Qtr Drive Down Passer
## 1      1   1     2    2      A
## 2      1   1     2    3      A

您可以使用by参数代替rename,但在这种情况下更多的输入。