在if_else和df $中使用rlang提供变量名作为字符串

时间:2018-12-07 21:08:57

标签: r tidyverse rlang

在以下代码中,

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 :(得分:1)

我们可以将字符串转换为符号,然后求值(!!

library(tidyverse)
mtcars %>% 
  mutate(var2 = if_else(!! rlang::sym(var1) >20, 1, 0))

这里不需要ifelse,因为as.integer可以将TRUE / FALSE强制为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'