【问题标题】:Pass a string as variable name in dplyr::mutate在 dplyr::mutate 中传递一个字符串作为变量名
【发布时间】:2020-04-28 15:16:28
【问题描述】:

我一直在阅读this SO 帖子,了解如何在 dplyr 中处理对变量的字符串引用。

我想根据字符串输入改变现有列:

var <- 'vs'
my_mtcars <- mtcars %>% 
  mutate(get(var) = factor(get(var)))

错误:意外的“=”在: “my_mtcars % 变异(get(var)=“

也试过了:

my_mtcars <- mtcars %>% 
  mutate(!! rlang::sym(var) = factor(!! rlang::symget(var)))

这导致了完全相同的错误消息。

如何根据在 var 变量中传递字符串 'vs' 来执行以下操作?

# works
my_mtcars <- mtcars %>% 
  mutate(vs = factor(vs))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    可以使用:= 执行此操作,同时评估 (!!) 并使用转换为 symbol 并评估分配的右轴

    library(dplyr)
    my_mtcars <- mtcars %>% 
           mutate(!! var  := factor(!! rlang::sym(var)))
    class(my_mtcars$vs)
    #[1] "factor"
    

    或者不用想太多,使用mutate_at,它可以在vars中取字符串并应用感兴趣的function

    my_mtcars2 <- mtcars %>% 
                        mutate_at(vars(var), factor)
    

    【讨论】:

    • 谢谢阿克伦。是否将:= 读为“更新”,就像将管道运算符读为“然后”一样?
    • @DougFir 它是一个赋值运算符(类似于 data.table 中使用的运算符,但行为不同)。这个赋值运算符确实对 lhs 和 rhs 进行评估
    • 也许我们也可以使用{{}},但不确定我们如何使用它来捕获var并使用它来命名。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多