dplyr filter:数据帧中的多个条件

问题描述 投票:3回答:2

我有一个包含所有条件的数据框。

cond.df = data.frame(
  mpg = c(21,18.7,22.8),
  gear = c(4,3,2),
  carb = c(4,3,2)
)

所以对于我的第一个输出,我想要一个相当于的过滤数据帧

mtcars %>% filter(mpg == 21, gear == 4, carb = 4)

我想要的输出将是一个n数据帧的列表。

list(mtcars %>% filter(mpg == 21, gear == 4, carb = 4),
 mtcars %>% filter(mpg == 18.7, gear == 3, carb = 3),
 mtcars %>% filter(mpg == 22.8, gear == 2, carb = 2))

另外,如果可能的话,我想要一个来自cond.df的未知数量的列的解决方案。

我知道如果我只有一个变量,我可以使用%in%,例如

mtcars %>% filter(gear %in% c(3,4))

但是,我有多个变量。

谢谢

r dplyr
2个回答
1
投票

我建议在你的inner_join上使用mtcarscond.df。这样,它可以匹配cond.df中任意多个变量。

我改变了你的条件数据框,使第二和第三行实际上匹配了一些东西。

library(dplyr)
cond.df = data.frame(
    mpg = c(21,18.7,22.8),
    gear = c(4,3,4),
    carb = c(4,2,1)
)

这将创建一个数据框,其中每行都包含已过滤/已连接的数据框。

result <- 
    cond.df %>%
    rowwise() %>%
    do(
        dfs = inner_join(as.data.frame(.), mtcars)
    )

如果您需要它作为数据帧列表,只需转换它。

as.list(result)$dfs

0
投票

您可以使用apply来逐行查看cond.df,然后使用匿名函数进行过滤:

apply(cond.df,1, function(x) mtcars %>% # the 1 is for row wise 
filter(mpg == x[1], gear == x[2], carb == x[3]))
© www.soinside.com 2019 - 2024. All rights reserved.