Рассмотрим тиббл, где каждый столбец - это символьный вектор, который может принимать много значений - скажем, от «A» до «F».
library(tidyverse)
sample_df <- tibble(q1 = c("A", "B", "C"), q2 = c("B", "B", "A"))
Я хочу создать функцию, которая принимает имя столбца в качестве аргумента и перекодирует этот столбец, так что любой ответ «A» становится NA, а df в противном случае возвращается как есть. Причиной его разработки является встраивание в более широкий конвейер, который выполняет серию операций с использованием данного столбца.
Есть много способов сделать это. Но мне интересно понять, каким будет лучший идиоматический подход tidy_eval / tidyverse. Во-первых, имя вопроса должно быть слева от глагола-мутанта, поэтому мы соответствующим образом используем операторы !!
и :=
. Но тогда, что поставить на правую сторону?
fix_question <- function(df, question) {
df %>% mutate(!!question := recode(... something goes here...))
}
fix_question(sample_df, "q1") # should produce a tibble whose first column is (NA, "B", "C")
Моя первоначальная мысль состояла в том, что это сработает:
df %>% mutate(!!question := recode(!!question, "A" = NA_character_))
Но, конечно же, ударная функция внутри функциипросто возвращает буквенную строку символов (например, «q1»). В итоге я выбрал то, что похоже на хакерский маршрут, для ссылки на данные справа, используя базовый оператор R [[
и опираясь на конструкцию .
из dplyr, и это работает, так что в некотором смысле я решилмоя основная проблема:
df %>% mutate(!!question := recode(.[[question]], "A" = NA_character_))
Мне интересно получить отзывы от людей, которые очень хорошо разбираются в том, есть ли более идиоматический способ сделать это, в надежде, что просмотр работающего примера улучшитмое понимание функции tidyeval установлено более широко. Есть мысли?