考虑以下 -
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
函数,该函数可快速有效地基于按组应用功能创建新列(以下是一个简单的示例,该示例使用mean
,ave
和dplyr
方法按组列创建data.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
而
tapply
提供摘要输出。 ave
的主要优点之一是,我们不必担心输出的顺序,因为它始终以与行相同的顺序提供输出。即使在某些tidyverse
函数中,这也可以改变。 sort
的unique
和ave
值是否始终等于tapply
的问题-这取决于。对于某些功能,我们可以在list
中获得汇总的tapply
输出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。总是唯一(ave)== tapply吗?如果是这样,为什么其中之一存在?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51183515/