在 R 中将 match.fun 与多个输入和过滤器一起使用

Using match.fun with multiple inputs and filter in R

我有以下数据库以及几个输入值:

operator <- ">="
amt <- 600
col <- "salary"

data <- data.frame(
   emp_id = c (1:5), 
   emp_name = c("Rick","Dan","Michelle","Ryan","Gary"),
   salary = c(623.3,515.2,611.0,729.0,843.25)
)

我已经 match.fun 使用原始列名,但想使用“col”值来指定要过滤的列名,类似于下面的内容:

data %>% 
   filter(match.fun(operator)(col, amt))

我试过添加“!!”当它在那里时到 col 的前面,但这不起作用。如果我在上面 table 中将“col”替换为“salary”,那确实有效,但我希望能够动态更改“col”是什么,并让函数对此做出反应。

我们可以根据输入col

使用.data到select列
library(dplyr)
data %>% 
   filter(match.fun(operator)(.data[[col]], amt))

-输出

   emp_id emp_name salary
1      1     Rick 623.30
2      3 Michelle 611.00
3      4     Ryan 729.00
4      5     Gary 843.25

或转换为 symbol 并计算 (!!)

data %>% 
 filter(match.fun(operator)(!! rlang::sym(col), amt))
  emp_id emp_name salary
1      1     Rick 623.30
2      3 Michelle 611.00
3      4     Ryan 729.00
4      5     Gary 843.25

或者另一种选择是将其传递给 across

data %>% 
   filter(across(all_of(col), ~ match.fun(operator)(.x, amt)))
  emp_id emp_name salary
1      1     Rick 623.30
2      3 Michelle 611.00
3      4     Ryan 729.00
4      5     Gary 843.25

或者另一种选择是使用 paste/str_c 创建表达式,然后解析

library(stringr)
data %>% 
  filter(!!rlang::parse_expr(str_c(col, operator, amt)))
  emp_id emp_name salary
1      1     Rick 623.30
2      3 Michelle 611.00
3      4     Ryan 729.00
4      5     Gary 843.25