如何仅使用函数的非缺失参数在 R 中应用过滤器?
假设我有这个功能:
extract_data <- function(.a = NA, .b = NA, .c = NA) {
df %>%
filter(a == .a,
b == .b,
c == .c)
}
如果我运行 extract_data(.a = 1, .c == 1)
,我希望该函数返回 df 中 a = 1
的所有行并且c = 1
,无论b
的值如何。
显然,上面的函数考虑了 b
的值,并且只会返回 a = 1
、c = 1
、和b = NA
。当其值为 NA
时,如何修改函数以忽略 b
?
我正在寻找动态解决方案,因为我的实际函数的参数比上面示例中使用的参数更多。
最佳答案
下面是一个可能对您有帮助的示例:
library(tidyverse)
extract_data <- function(df, ...) {
condition = enquos(...)
df %>%
filter(!!!condition)
}
extract_data(mtcars, mpg > 25, gear > 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
#2 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
extract_data(mtcars, mpg > 25)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 2 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# 3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 4 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
# 5 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
# 6 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
extract_data(mtcars, gear == 4, carb == 1)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# 2 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 4 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
在这种情况下,您不需要对要在过滤器中检查的任何变量进行硬编码。您可以在函数调用中定义它们。
注意:这种方法为您在函数调用中定义过滤条件提供了充分的灵 active 。例如:
extract_data(mtcars, gear == 4 & (carb == 1 | hp > 100))
在函数定义中使用 ...
时,请确保命名其他函数参数以避免混淆。
关于r - 仅使用函数的非缺失参数应用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53883908/