Как отфильтровать фрейм данных, используя несколько параметров функции, которые могут передаваться или не передаваться? (R; dplyr) - PullRequest
0 голосов
/ 04 ноября 2018

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

Почему это сокращение с использованием quo не работает таким образом, и как я могу изменить его, чтобы оно работало?

library(dplyr); library(datasets)
filterhec <- function(hair = '', eyecolor = '', sex = '') {
  hec <- as.data.frame(datasets::HairEyeColor)

    # Filter condition variable, which changes depending on parameters
    fcond <- quo(
      (ifelse(hair == '', 1, Hair == hair)) & 
      (ifelse(all(eyecolor == ''), 1, Eye %in% eyecolor)) & 
      (ifelse(sex == '', 1, Sex == sex)))

  filter(hec, !!fcond)
}

filterhec(hair = 'Black', eye = c('Brown', 'Blue'))
#     Hair   Eye    Sex Freq
# 1  Black Brown   Male   32
# 2  Brown Brown   Male   53
# 3    Red Brown   Male   10
# 4  Blond Brown   Male    3
# 5  Black  Blue   Male   11
# 6  Brown  Blue   Male   50
# 7    Red  Blue   Male   10
# 8  Blond  Blue   Male   30
# 9  Black Hazel   Male   10
#
# ^Expected dataframe where Hair is always 'Black' and Eye is 'Brown' or 'Blue' 

1 Ответ

0 голосов
/ 04 ноября 2018

Аргументы вашей функции уже указаны в виде символьных векторов, а переменные, по которым вы фильтруете, также жестко запрограммированы. Поэтому я не думаю, что есть необходимость в quo. Вы можете сделать это так:

library(dplyr)
library(datasets)

filterhec <- function(hair = NULL, eyecolor = NULL, sex = NULL) {
  hec <- as.data.frame(datasets::HairEyeColor)

  filter(
    hec,
    if (is.null(hair)) 1 else Hair == hair,
    if (is.null(eyecolor)) 1 else Eye %in% eyecolor,
    if (is.null(sex)) 1 else Sex == sex
  )
}

filterhec(hair = 'Black', eye = c('Brown', 'Blue'))
#>    Hair   Eye    Sex Freq
#> 1 Black Brown   Male   32
#> 2 Black  Blue   Male   11
#> 3 Black Brown Female   36
#> 4 Black  Blue Female    9
...