【发布时间】:2018-04-22 15:21:54
【问题描述】:
这个问题是“为什么”,而不是如何。在下面的代码中,我试图理解为什么dplyr::mutate 使用整个向量而不是其他自定义函数 (g()) 来评估一个自定义函数 (f())。 mutate到底在做什么?
set.seed(1);sum(rnorm(100, c(0, 10, 100)))
f=function(m) {
set.seed(1)
sum(rnorm(100, mean=m))
}
g <- function(m) sin(m)
df <- data.frame(a=c(0, 10, 100))
y1 <- mutate(df, asq=a^2, fout=f(a), gout=g(a))
y2 <- rowwise(df) %>%
mutate(asq=a^2, fout=f(a), gout=g(a))
y3 <- group_by(df, a) %>%
summarize(asq=a^2, fout=f(a), gout=g(a))
对于所有三列,asq、fout 和 gout,在 y2 和 y3 中按行进行评估,结果相同。但是,y1$fout 对于所有三行都是 3640.889,这是评估 sum(rnorm(100, c(0, 10, 100))) 的结果。所以函数f() 正在评估每一行的整个向量。
在其他地方mutate/transform in R dplyr (Pass custom function) 提出了一个密切相关的问题,但没有解释“为什么”。
【问题讨论】: