gpt4 book ai didi

r - 在 mutate : an alternative to mutate_(. 点 = ...) 中使用引号

转载 作者:行者123 更新时间:2023-12-02 16:17:07 26 4
gpt4 key购买 nike

我想将不同的函数应用于小标题中的同一列。这些函数存储在字符串中。我曾经使用 mutate_.dots 参数来做到这一点,如下所示:

library(dplyr)

myfuns <- c(f1 = "a^2", f2 = "exp(a)", f3 = "sqrt(a)")
tibble(a = 1:3) %>%
mutate_(.dots = myfuns)

这种方法仍然可以正常工作,但 mutate_ 已被弃用。我尝试使用 mutaterlang 包获得相同的结果,但没有取得多大进展。

在我的真实示例中,myfuns 包含大约 200 个函数,因此不能一一键入它们。

提前致谢。

最佳答案

对于采用单个输入的简单方程,提供函数本身就足够了,例如

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)

在这里,quo creates a “quosure” — 即方程的引用表示形式,与字符串的使用相同,除了与字符串不同的是,这个表达式的作用域正确,可以直接由 dplyr 使用,并且概念上更清晰:它与任何其他 R 表达式一样,只是尚未评估。区别如下:

  • 1 + 2 是值为 3 的表达式。
  • quo(1 + 2) 是一个未计算的表达式,其值为 1 + 2计算结果为 3 ,但需要明确评估。那么我们如何评估未评估的表达式呢?嗯……:

然后!! (pronounced “bang bang”) 取消引用之前引用的表达式,即在 mutate 的上下文中对其求值。这很重要,因为 Sepal.LengthSepal.Width 仅在 mutate 调用内部已知,而不是在其外部。

<小时/>

在上述所有情况下,表达式也可以位于列表内。唯一的区别是,对于列表,您需要使用 !!! 而不是 !!:

funs = list(
Sepal.Area = quo(Sepal.Length * Sepal.Width),
Sepal.Ratio = quo(Sepal.Length / Sepal.Width)
)

iris %>% mutate(!!! funs)

!!! 操作称为“unquote-splice”。这个想法是,它将其参数的列表元素“拼接”到父调用中。也就是说,它似乎修改了调用,就好像它逐字包含列表元素作为参数一样(但这仅适用于支持它的函数,例如 mutate)。

关于r - 在 mutate : an alternative to mutate_(. 点 = ...) 中使用引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com