首页 > 解决方案 > 可变过滤条件

问题描述

我知道这个问题很可能是重复的。我试图用谷歌搜索这个问题,但我找不到我要找的东西。

我想做的是根据用户指定的条件过滤数据集。例如:

df <- 
  data.frame(type = c("a", "a", "b", "b"), 
           value = c(1,5,7,2), stringsAsFactors = F) %>% 
  as_tibble()

cond <- ">"
val <- 2
df %>% filter(value, cond, val)

(即与 相同df %>% filter(value>2)

如果可能的话,我将能够在函数内部和外部使用此设置。

编辑:

当我问我的问题时,我有点着急。我真正想要的是mutate根据用户指定的条件,而不是过滤。Ronak Shahs 的回答解决了这个filter问题,我只是对这个问题做了一些小的改动mutate。我认为没有必要发布一个新问题,因为这两个问题密切相关。因此,我只是发布了有关该mutate问题的答案(也回答了 Tjebo 的评论)。

标签: rdplyr

解决方案


另一种方法是使用match.fun匹配函数来应用并使用 NSE 将其应用于列。

library(dplyr)
library(rlang)

apply_fun <- function(df, col, fun, val) {
   fun1 <- match.fun(fun)
   df %>% filter(fun1({{col}}, val))
}

df %>% apply_fun(value, cond, val)

#  type  value
#  <chr> <dbl>
#1 a         5
#2 b         7

df %>% apply_fun(value, cond, 1)
# A tibble: 3 x 2
#  type  value
#  <chr> <dbl>
#1 a         5
#2 b         7
#3 b         2

推荐阅读