Введите имя переменной в виде строки, используя rlang в if_else и df $ - PullRequest
0 голосов
/ 08 декабря 2018

В следующем коде

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 Ответ

0 голосов
/ 08 декабря 2018

Мы можем преобразовать строку в символ и затем оценить (!!)

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 '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...