在 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
或转换为 sym
bol 并计算 (!!
)
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
我有以下数据库以及几个输入值:
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
或转换为 sym
bol 并计算 (!!
)
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