gpt4 book ai didi

r - ave vs tapply。 unique(ave)==tapply 总是吗?如果是这样,为什么其中之一存在?

转载 作者:行者123 更新时间:2023-12-02 08:06:14 26 4
gpt4 key购买 nike

考虑以下 -

set.seed(1)
x <- runif(100)
y <- sample(c('M', 'F', 'D'), 100, TRUE)
aveResult <- ave(x = x, y, FUN = sum)
tapplyResult <- tapply(x, y, sum)
aveResult <- setNames(aveResult, y)
tapplyResult
aveResult[!duplicated(names(aveResult))]

这两个函数的结果除了输出的长度之外是相同的。此外,这也会造成困惑(由于回收而加剧),如 this case .

有没有一个函数可以做另一个函数不能做的事情的例子?

最佳答案

ave 是一个非常有用的 base R 函数,它可以快速高效地创建基于按组应用函数的新列(下面是一个创建 的简单示例code>mean 使用 avedplyrdata.table 方法的组列)。

set.seed(24)
df1 <- data.frame(grp = sample(LETTERS, 1e6, replace = TRUE), val = rnorm(1e6))
system.time(with(df1, ave(val, grp)))
# user system elapsed
# 0.070 0.004 0.073

library(dplyr)
system.time(df1 %>%
group_by(grp) %>%
mutate(new = mean(val)))
# user system elapsed
# 0.159 0.000 0.160

library(data.table)
system.time(setDT(df1)[, new := mean(val), by = grp])
# user system elapsed
# 0.056 0.000 0.057

while tapply 给出了汇总输出。 ave 的主要优点之一是我们不必担心输出的顺序,因为它总是以相同的行顺序给出输出。这甚至可以在某些 tidyverse 函数中改变。 avesorted unique 值是否始终等于tapply 的问题 - 这取决于。对于某些功能,我们可以在 tapply

中获得汇总的 list 输出
tapply(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)

ave 在这里失败了,因为它不会匹配每个组的长度

ave(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)

并给出警告

关于r - ave vs tapply。 unique(ave)==tapply 总是吗?如果是这样,为什么其中之一存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51183515/

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