Введите имя переменной в виде строки, используя rlang в if_else и df$
В следующем коде
library(tidyverse)
mtcars %>% mutate(var2 = if_else(mpg >20, 1, 0))
as.numeric(as.vector(mtcars$mpg))
Я хочу параметризовать MPG как
var1 <- "mpg"
но следующий код не дает правильные результаты, я уверен, что я не использую Rlang правильно.
mtcars %>% mutate(var2 = if_else(!!quo(var1) >20, 1, 0))
as.numeric(as.vector(mtcars$!!quo(var1)))
Что мне здесь не хватает?
1 ответ
Решение
Мы можем преобразовать строку в символ и затем оценить (!!
)
library(tidyverse)
mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0))
ifelse
здесь не нужен, так как as.integer
может принудить ИСТИНА / ЛОЖЬ к 1/0
mtcars %>%
mutate(var2 = as.integer(!! rlang::sym(var1) >20))
Для второго куска кода мы можем использовать [[
вместо $
извлечь столбец
as.numeric(mtcars[[var1]])
Если есть сомнения по поводу выражения с кавычками, используйте qq_show
чтобы понять основную проблему
rlang::qq_show(mtcars %>%
mutate(var2 = if_else(!!quo(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else((^var1) > 20, 1, 0))
а теперь с преобразованием символов
rlang::qq_show( mtcars %>%
mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0)))
#mtcars %>% mutate(var2 = if_else(mpg > 20, 1, 0))
Обратите внимание, что в первом случае он оценивается как "var1", а не как столбец "mpg".