Применение фильтра с использованием только не пропущенных аргументов функции - PullRequest
0 голосов
/ 21 декабря 2018

Как я могу применить фильтр в 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.Как я могу изменить функцию так, чтобы она игнорировала b, если ее значение равно NA?

Я ищу динамическое решение, поскольку у моей фактической функции больше аргументов, чем в приведенном выше примере.

1 Ответ

0 голосов
/ 21 декабря 2018

Вот пример, который может вам помочь:

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

В этом случае вам не нужно жестко кодировать какие-либо переменные для проверки в фильтре.Вы можете просто определить их в вызове функции.

Примечание: этот подход дает вам полную гибкость в определении условий фильтрации при вызове функции.Например:

extract_data(mtcars, gear == 4 & (carb == 1 | hp > 100))

При использовании ... в определении функции не забудьте назвать другие аргументы функции, чтобы избежать путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...