在dplyr::mutate中将字符串作为变量名称传递

6

我一直在阅读这个SO帖子,学习如何在dplyr中使用字符串引用变量。

我想根据字符串输入来修改已有的列:

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

错误:在以下代码中出现意外的“=”符号:

"my_mtcars <- mtcars %>% mutate(get(var) ="

也尝试过:

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

这导致了完全相同的错误信息。
如何基于将字符串“vs”传递到变量中来执行以下操作?在mutate中进行处理?
# works
my_mtcars <- mtcars %>% 
  mutate(vs = factor(vs))
1个回答

13

在评估时可以使用:=进行此操作,同时使用!!将其转换为symbol并在赋值的rhs上进行评估。

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)

谢谢Akrun。在读取:=时,是否可以像读取管道操作符为“然后”一样将其读取为“更新”? - Doug Fir
@DougFir 这是一个赋值运算符(类似于data.table中使用的那个,但具有不同的行为)。这个赋值运算符在lhs和rhs上进行求值。 - akrun
1
也许我们也可以使用 {{}},但不确定如何使用它来捕获 var 并将其用于命名。 - NelsonGon
@NelsonGon mtcars %>% mutate("{x}" := factor(!! rlang::sym(x))) 可行,参见 vignette("programming", "dplyr")。但我不确定如何替换 factor(!! rlang::sym(x))。@akrun 你知道是否可以/应该使用 {{}} 来替代右侧的 !! 吗? - JWilliman
@JWilliman 我还没有测试过,但你可以尝试使用 mtcars %>% mutate(var = factor({{var}}))。 - NelsonGon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接