Рассмотрим таблицу, в которой каждый столбец представляет собой вектор символов, который может принимать множество значений - скажем, от «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, о том, есть ли более идиоматический способ сделать это, в надежде, что просмотр рабочего примера улучшит мое понимание набора функций tidyeval в более общем плане. Есть предположения?
q1
(символ), так и с"q1"
(строка):df %>% mutate_at( vars(!!ensym(question)), recode, A = NA_character_)
- person Artem Sokolov   schedule 11.10.2019