Как отфильтровать фрейм данных, используя несколько параметров функции, которые могут передаваться или не передаваться? (R; dplyr)
Я пишу функцию, которая принимает несколько параметров, строк или векторов строк, соответствующих атрибутам, по которым я хотел бы отфильтровать. Я также хотел бы написать свою функцию, чтобы, когда атрибут фильтра не был указан, он просто игнорировался, а другие атрибуты фильтра работали.
Почему это сокращение использует 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 ответ
Аргументы вашей функции уже указаны в виде символьных векторов, а переменные, по которым вы фильтруете, также жестко запрограммированы. Поэтому я не думаю, что есть необходимость 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