gpt4 book ai didi

r - 为什么 R dplyr::mutate 与自定义函数不一致

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

这个问题是一个“为什么”,而不是一个如何。在下面的代码中,我试图理解为什么 dplyr::mutate用整个向量计算一个自定义函数 ( f() ),但不计算另一个自定义函数 ( g() )。究竟是什么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) ,但没有解释“为什么”。

最佳答案

sin^是矢量化的,因此它们 native 对每个单独的值进行操作,而不是对整个值向量进行操作。 f未矢量化。但是你可以做f = Vectorize(f)它也会对每个单独的值进行操作。

y1 <- mutate(df, asq=a^2, fout=f(a), gout=g(a))
y1

    a   asq     fout       gout
1 0 0 3640.889 0.0000000
2 10 100 3640.889 -0.5440211
3 100 10000 3640.889 -0.5063656

f = Vectorize(f)

y1a <- mutate(df, asq=a^2, fout=f(a), gout=g(a))
y1a

    a   asq        fout       gout
1 0 0 10.88874 0.0000000
2 10 100 1010.88874 -0.5440211
3 100 10000 10010.88874 -0.5063656


关于矢量化的一些附加信息 here , here , 和 here .

关于r - 为什么 R dplyr::mutate 与自定义函数不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49967559/

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