函数tapply和ave之间有什么区别?

时间:2014-03-09 22:47:26

标签: r aggregate tapply

我不能围绕ave功能。我阅读了帮助并搜索了网络,但我仍然无法理解它的作用。我理解它在观察子集上应用了某些功能,但与例如tapply

的方式不同

有人可以用一个小例子来启发我吗?

谢谢,请原谅我提出的不寻常请求。

1 个答案:

答案 0 :(得分:13)

tapply会返回每个因子级别的单个结果。 ave也会在每个因子级别生成一个结果,但会将此值复制到原始数据中的每个位置。

ave可以方便地在包含摘要数据的数据框中生成新列。

一个简短的例子:

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

一个值,即每个因子水平的平均值。

ave上的

iris生成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。