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

Ame*_*eya 2 r

考虑以下 -

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))]
Run Code Online (Sandbox Code Playgroud)

除了输出的长度不同外,这两个函数的结果是相同的。此外,在这种情况下,这也会造成混乱(由于回收而加剧)。

有没有一个例子,其中一个功能可以做另一个不能做的事情?

akr*_*run 5

ave是一个非常有用的base R函数,它可以快速有效地基于按组应用函数创建新列(下面是一个mean使用ave,dplyrdata.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 
Run Code Online (Sandbox Code Playgroud)

whiletapply给出一个总结的输出。的主要优点之一ave是我们不必担心输出的顺序,因为它总是以相同的行顺序给出输出。即使在某些tidyverse功能中,这也可能会发生变化。的sorteduniqueave是否总是等于的问题tapply- 这取决于。对于某些函数,我们可以listtapply

tapply(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)
Run Code Online (Sandbox Code Playgroud)

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

ave(1:10, rep(LETTERS[1:3], c(3, 3, 4)), FUN = range)
Run Code Online (Sandbox Code Playgroud)

并发出警告