Как лучше использовать имена переменных в качестве аргументов функций в правой части глаголов dplyr, таких как mutate
?
Чтобы применить функцию к переменной в таблице с помощью mutate
,тривиально, если мы используем имя столбца напрямую:
mtcars %>%
select(mpg) %>%
mutate(mpg = as.character(mpg)) %>%
glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...
Что если мы не знаем имя столбца, но оно хранится в переменной в виде строки? В качестве простого примера давайте сохраним строку «mpg» в var_of_interest
, а затем изменим все значения на «5». Это хорошо с простым присваиванием в правой части выражения mutate
(например, присвоение 5 всем значениям), если мы заключаем в кавычки с !!
и :=
:
var_of_interest <- colnames(mtcars)[1]
glimpse(var_of_interest)
# chr "mpg"
mtcars %>% select(var_of_interest) %>%
mutate(!! var_of_interest := 5) %>%
glimpse()
# Observations: 32
# Variables: 1
# $ mpg <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
Howмы должны использовать var_of_interest
внутри функции в правой части вызова mutate
? Например, внутри as.character
. Следующее будет работать, без кавычек as.name(var_of_interest)
. ( Благодаря этому сообщению SO и ответу, используя as.symbol .)
mtcars %>%
select(var_of_interest) %>%
mutate(!! var_of_interest := as.character(!! as.name(var_of_interest))) %>%
glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...
Следующее, используя rlang::sym
, также работает ( благодаря этому сообщению SO иответ ):
mtcars %>%
select(var_of_interest) %>%
mutate(!! var_of_interest := as.character(!! rlang::sym(var_of_interest))) %>%
glimpse()
# Observations: 32
# Variables: 1
# $ mpg <chr> "21", "21", "22.8", "21.4", "18.7", "18.1", "14.3", "24.4", "22.8", "19.2", "17.8", "16.4", "17.3", "15.2", ...
Есть ли недостатки у любого из этих методов? Должны ли мы использовать quo
или enquo
вместо этого? Последние обсуждаются в этой виньетке , но я изо всех сил пытаюсь понять их использование, и я хотел бы услышать больше об этом.