1

假设我想使用dplyr标准评估为列的每个值加 1。

我可以 :

library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))

但是,如果我想+用作二元运算符而不是函数怎么办?我不知道如何+在 quosure 中用符号编写。在我的大多数尝试中,我在尝试将非数字参数(例如符号)与二元运算符一起使用时遇到错误+

使用不推荐使用的,mutate_您可以使用lazyeval::interp它让您轻松地做到这一点:

mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))

任何帮助,将不胜感激。谢谢。

4

1 回答 1

3

你可以使用

mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)

请注意 bang-bang 部分周围的括号。这只是必要的,因为您可能使用的是旧版本的 rlang。在旧版本(<0.2)中,!!优先级非常低,因此添加发生在扩展之前。从 rlang 0.2 开始,!!赋予了不同的运算符优先级,并且按照您的预期工作。

当然,如果您将相同的转换应用于一堆列,您可能希望使用mutate_atmutate_allmutate_if版本,这也允许转换特定于公式语法。

mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)
于 2018-03-06T16:07:29.420 回答