tapply和ave函数有什么区别?

6

我无法理解ave函数。我已经阅读了帮助文档并在网络上搜索,但仍然无法理解它的作用。我知道它会对一组观测值的子集应用某个函数,但与tapply不同。

请问是否可以给出一个简单的例子来帮助我理解呢?

谢谢,如果我的要求有些特别,请多多包涵。

1个回答

13

tapply为每个因子水平返回单个结果。 ave也为每个因子水平生成单个结果,但将此值复制到原始数据中的每个位置。

ave对于在数据框中产生包含摘要数据的新列非常便利。

一个简短的示例:

tapply(iris$Sepal.Length, iris$Species, FUN=mean)
    setosa versicolor  virginica 
     5.006      5.936      6.588 

每个因子水平的均值是一种价值。

aveiris上产生150个结果,这些结果与原始数据框对齐:

 ave(iris$Sepal.Length, iris$Species, FUN=mean)
  [1] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
 [17] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
 [33] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
 [49] 5.006 5.006 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
 [65] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
 [81] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
 [97] 5.936 5.936 5.936 5.936 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[113] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[129] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[145] 6.588 6.588 6.588 6.588 6.588 6.588

正如评论中所述,这里的单个值被循环利用以填充原始数据中的每个位置。

如果函数返回多个值,则必要时将这些值循环利用以填充位置。例如:

d <- data.frame(a=rep(1:2, each=5), b=1:10)
ave(d$b, d$a, FUN=rev)
 [1]  5  4  3  2  1 10  9  8  7  6

感谢Josh和thelatemail。


2
糟糕,我发布了自己的答案(现已删除),没有看到你的答案。我建议进行一些小的更正,即avetapply都不需要每个因子水平产生一个单一结果。设置FUN=cumsum或类似的内容来查看。 - Josh O'Brien
1
tapply 每个因子水平只会产生一个结果。这个结果可能是多个值、列表、其他对象等。ave 也可以返回多个值,并且如果返回的值的数量与输入向量的长度相匹配,它将这样做(可能是合理的)。例如 ave(1:10,rep(1:2,each=5),FUN=rev) - thelatemail
我建议在这个例子中使用 rep(1:2, each=5),因为这样更容易识别各组内的反转。 - thelatemail
@thelatemail 是的,那样更好。 - Matthew Lundberg
它也可能会与聚合函数混淆。 - skan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接