gpt4 book ai didi

r - 数据变异的查找函数

转载 作者:行者123 更新时间:2023-12-04 02:57:49 26 4
gpt4 key购买 nike

我想将函数或至少它们的名称存储在 data.frame 的列中,以用于调用 mutate。一个简化的错误示例:

library(dplyr)
expand.grid(mu = 1:5, sd = c(1, 10), stat = c('mean', 'sd')) %>%
group_by(mu, sd, stat) %>%
mutate(sample = get(stat)(rnorm(100, mu, sd))) %>%
ungroup()

如果这按照我的想法工作,sample 的值将由 .GlobalEnv 中的函数生成,对应于 'mean''sd',具体取决于行。

我得到的错误是:

 Error in mutate_impl(.data, dots) : 
Evaluation error: invalid first argument.

当然这与非标准评估有关...grrr。

最佳答案

这里有几个问题。首先 expand.grid 会将字符值转换为因子。而且 get() 不喜欢使用因子(即 get(factor("mean")) 会给出错误)。 tidyverse 友好版本是 tidyr::crossing()。 (您也可以将 stringsAsFactors=FALSE 传递给 expand.grid。)

其次,mutate()假设你调用的所有函数都是向量化的,但是像get()这样的函数不是向量化的,它们需要被单独调用一次。一种比在此处执行 group_by 以保证一次一个评估更安全的方法是使用 rowwise()

最后,您真正的问题是您正在尝试调用 get("sd") 但是当您这样做时,sd 也恰好是您的data.frame 是 mutate 的一部分。这样get()会先找到这个sd,而这个sd只是一个数字,不是函数。您需要明确地告诉 get() 从全局环境中提取。尝试

tidyr::crossing(mu = 1:5, sd = c(1, 10), stat = c('mean', 'sd')) %>%
rowwise() %>%
mutate(sample = get(stat, envir = globalenv())(rnorm(100, mu, sd)))

关于r - 数据变异的查找函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105540/

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