使用 tidyeval 编写自定义 case_when 函数以在 dplyr mutate 中使用

Har*_*y M 0 r dplyr tidyverse tidyeval

我正在尝试编写一个自定义 case_when 函数以在 dplyr 内部使用。我一直在阅读其他问题中发布的 tidyeval 示例,但仍然不知道如何使其工作。这是一个代表:

\n\n
df1 <- data.frame(animal_1 = c("Horse", "Pig", "Chicken", "Cow", "Sheep"),\n           animal_2 = c(NA, NA, "Horse", "Sheep", "Chicken"))\n\n\ntranslate_title <- function(data, input_col, output_col) {\n  mutate(data, \n    !!output_col := case_when(\n    input_col == "Horse" ~ "Cheval",\n    input_col == "Pig" ~ "\xd0\xa0orc",\n    input_col == "Chicken" ~ "Poulet",\n    TRUE ~ NA)\n  )\n}\n\n\ndf1 %>% \n  translate_title("animal_1", "animaux_1") %>% \n  translate_title("animal_2", "animaux_2")\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我尝试运行它时,我得到\nError in mutate_impl(.data, dots) : Evaluation error: must be type string, not logical.

\n\n

另外,我实际上想重写该函数,以便可以像这样使用它:

\n\n
df1 %>% \n  mutate(animaux_1 = translate_title(animal_1),\n         animaux_2 = translate_title(animal_2)\n         )\n
Run Code Online (Sandbox Code Playgroud)\n\n

但不确定如何。

\n

Ron*_*hah 5

根据您希望如何将输入传递给函数,您可以通过两种方式解决它:

\n\n

1)使用不带引号的方式传递输入{{}}

\n\n
library(dplyr)\n\ntranslate_title <- function(data, input_col, output_col) {\n\n   mutate(data, \n        !!output_col := case_when(\n        {{input_col}} == "Horse" ~ "Cheval",\n        {{input_col}} == "Pig" ~ "\xd0\xa0orc",\n        {{input_col}} == "Chicken" ~ "Poulet",\n        TRUE ~ NA_character_)\n  )\n}\n\ndf1 %>% \n  translate_title(animal_1, "animaux_1") %>%\n  translate_title(animal_2, "animaux_2")\n\n#  animal_1 animal_2 animaux_1 animaux_2\n#1    Horse     <NA>    Cheval      <NA>\n#2      Pig     <NA>      \xd0\xa0orc      <NA>\n#3  Chicken    Horse    Poulet    Cheval\n#4      Cow    Sheep      <NA>      <NA>\n#5    Sheep  Chicken      <NA>    Poulet\n
Run Code Online (Sandbox Code Playgroud)\n\n

2) 使用symand传递引用的输入!!

\n\n
translate_title <- function(data, input_col, output_col) {\n   mutate(data, \n         !!output_col := case_when(\n          !!sym(input_col) == "Horse" ~ "Cheval",\n          !!sym(input_col) == "Pig" ~ "\xd0\xa0orc",\n          !!sym(input_col) == "Chicken" ~ "Poulet",\n          TRUE ~ NA_character_)\n  )\n}\n\ndf1 %>% \n  translate_title("animal_1", "animaux_1") %>%\n  translate_title("animal_2", "animaux_2")\n
Run Code Online (Sandbox Code Playgroud)\n