【问题标题】:Provide a variable name as a string using rlang in if_else and df$在 if_else 和 df$ 中使用 rlang 将变量名作为字符串提供
【发布时间】:2018-12-07 21:08:57
【问题描述】:

在下面的代码中,

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)))

我在这里错过了什么?

【问题讨论】:

    标签: r tidyverse rlang


    【解决方案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'

    【讨论】:

    • 好的,那我们可以对 as.numeric(as.vector(mtcars$!!quo(var1))) 做点什么吗?
    • 第一行就可以了,谢谢!如果您也知道如何解决这个问题,我的代码中还有一行:as.numeric(as.vector(mtcars$!!quo(var1)))
    • @Geet 不要使用$,使用[[,即as.numeric(mtcars[[var1]])
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2017-04-04
    相关资源
    最近更新 更多