使用 tidyeval 编写自定义 case_when 函数以在 dplyr mutate 中使用
Writing a custom case_when function to use in dplyr mutate using tidyeval
我正在尝试编写自定义 case_when 函数以在 dplyr 中使用。我一直在阅读其他问题中发布的 tidyeval 示例,但仍然无法弄清楚如何使其工作。这是一个代表:
df1 <- data.frame(animal_1 = c("Horse", "Pig", "Chicken", "Cow", "Sheep"),
animal_2 = c(NA, NA, "Horse", "Sheep", "Chicken"))
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
input_col == "Horse" ~ "Cheval",
input_col == "Pig" ~ "Рorc",
input_col == "Chicken" ~ "Poulet",
TRUE ~ NA)
)
}
df1 %>%
translate_title("animal_1", "animaux_1") %>%
translate_title("animal_2", "animaux_2")
当我尝试 运行 这个时,我得到了
Error in mutate_impl(.data, dots) : Evaluation error: must be type string, not logical.
其实我也想重写这个函数,这样它就可以这样使用了:
df1 %>%
mutate(animaux_1 = translate_title(animal_1),
animaux_2 = translate_title(animal_2)
)
但不确定如何。
根据您想将输入传递给函数的方式,您可以通过两种方式解决它:
1) 使用 {{}}
将输入作为未加引号传递
library(dplyr)
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
{{input_col}} == "Horse" ~ "Cheval",
{{input_col}} == "Pig" ~ "Рorc",
{{input_col}} == "Chicken" ~ "Poulet",
TRUE ~ NA_character_)
)
}
df1 %>%
translate_title(animal_1, "animaux_1") %>%
translate_title(animal_2, "animaux_2")
# animal_1 animal_2 animaux_1 animaux_2
#1 Horse <NA> Cheval <NA>
#2 Pig <NA> Рorc <NA>
#3 Chicken Horse Poulet Cheval
#4 Cow Sheep <NA> <NA>
#5 Sheep Chicken <NA> Poulet
2) 使用 sym
和 !!
传递引用的输入
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
!!sym(input_col) == "Horse" ~ "Cheval",
!!sym(input_col) == "Pig" ~ "Рorc",
!!sym(input_col) == "Chicken" ~ "Poulet",
TRUE ~ NA_character_)
)
}
df1 %>%
translate_title("animal_1", "animaux_1") %>%
translate_title("animal_2", "animaux_2")
我正在尝试编写自定义 case_when 函数以在 dplyr 中使用。我一直在阅读其他问题中发布的 tidyeval 示例,但仍然无法弄清楚如何使其工作。这是一个代表:
df1 <- data.frame(animal_1 = c("Horse", "Pig", "Chicken", "Cow", "Sheep"),
animal_2 = c(NA, NA, "Horse", "Sheep", "Chicken"))
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
input_col == "Horse" ~ "Cheval",
input_col == "Pig" ~ "Рorc",
input_col == "Chicken" ~ "Poulet",
TRUE ~ NA)
)
}
df1 %>%
translate_title("animal_1", "animaux_1") %>%
translate_title("animal_2", "animaux_2")
当我尝试 运行 这个时,我得到了
Error in mutate_impl(.data, dots) : Evaluation error: must be type string, not logical.
其实我也想重写这个函数,这样它就可以这样使用了:
df1 %>%
mutate(animaux_1 = translate_title(animal_1),
animaux_2 = translate_title(animal_2)
)
但不确定如何。
根据您想将输入传递给函数的方式,您可以通过两种方式解决它:
1) 使用 {{}}
library(dplyr)
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
{{input_col}} == "Horse" ~ "Cheval",
{{input_col}} == "Pig" ~ "Рorc",
{{input_col}} == "Chicken" ~ "Poulet",
TRUE ~ NA_character_)
)
}
df1 %>%
translate_title(animal_1, "animaux_1") %>%
translate_title(animal_2, "animaux_2")
# animal_1 animal_2 animaux_1 animaux_2
#1 Horse <NA> Cheval <NA>
#2 Pig <NA> Рorc <NA>
#3 Chicken Horse Poulet Cheval
#4 Cow Sheep <NA> <NA>
#5 Sheep Chicken <NA> Poulet
2) 使用 sym
和 !!
translate_title <- function(data, input_col, output_col) {
mutate(data,
!!output_col := case_when(
!!sym(input_col) == "Horse" ~ "Cheval",
!!sym(input_col) == "Pig" ~ "Рorc",
!!sym(input_col) == "Chicken" ~ "Poulet",
TRUE ~ NA_character_)
)
}
df1 %>%
translate_title("animal_1", "animaux_1") %>%
translate_title("animal_2", "animaux_2")