对于采用单个输入的简单方程,提供函数本身就足够了,例如
iris %>% mutate_at(vars(-Species), sqrt)
或者,当使用方程而不是简单函数时,通过公式:
iris %>% mutate_at(vars(-Species), ~ . ^ 2)
当使用访问多个单个变量的方程时,您需要使用 rlang quosures:
area = quo(Sepal.Length * Sepal.Width)
iris %>% mutate(Sepal.Area = !! area)
Here, quo创造了一个“限额”— 即方程的引用表示形式,与字符串的使用相同,除了与字符串不同的是,这个表达式的作用域正确,可以直接由 dplyr 使用,并且概念上更清晰:它与任何其他 R 表达式一样,只是尚未评估。区别如下:
-
1 + 2
是一个有值的表达式3
.
-
quo(1 + 2)
是一个未计算的表达式,具有值1 + 2
that 评估为 3
,但需要明确评估。那么我们如何评估未评估的表达式呢?出色地 …:
Then !!(发音为“bang bang”) unquotes前面引用的表达式,即评估它 -在上下文中mutate
。这很重要,因为Sepal.Length
and Sepal.Width
只在内部知道mutate
打电话,而不是在外面。
在上述所有情况下,表达式也可以位于列表内。唯一的区别是,对于列表,您需要使用!!!
代替!!
:
funs = list(
Sepal.Area = quo(Sepal.Length * Sepal.Width),
Sepal.Ratio = quo(Sepal.Length / Sepal.Width)
)
iris %>% mutate(!!! funs)
The !!!
操作称为“取消引用拼接”。这个想法是,它将其参数的列表元素“拼接”到父调用中。也就是说,它似乎修改了调用,就好像它逐字包含列表元素作为参数一样(这只适用于函数,例如mutate
,但支持它)。