r - 仅使用函数的非缺失参数应用过滤器

标签 r dplyr

如何仅使用函数的非缺失参数在 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 = 1c = 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/

相关文章:

r - lme4计算协方差的置信区间

r - 如何在ggplot R中跳过x轴上的所有其他日期标签

r - 是否有更优雅的方法将参差不齐的数据转换为整洁的数据框

r - 从数据框创建稀疏矩阵

r - 使用 dplyr 按组计算百分比

r - 对于 R 中的其他剩余列值,如何检查一种类型的列值类别的常见出现?

r - 将相关性测试结果添加到 ggplot

r - 如何在R中向量化子集功能?

r - 如何以矢量化/快速方式基于其他列创建列?

r - 使用 ggplot stat_smooth 绘制多项式回归线