我无法理解ave
函数。我已经阅读了帮助文档并在网络上搜索,但仍然无法理解它的作用。我知道它会对一组观测值的子集应用某个函数,但与tapply
不同。
请问是否可以给出一个简单的例子来帮助我理解呢?
谢谢,如果我的要求有些特别,请多多包涵。
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。
ave
和tapply
都不需要每个因子水平产生一个单一结果。设置FUN=cumsum
或类似的内容来查看。 - Josh O'Brientapply
每个因子水平只会产生一个结果。这个结果可能是多个值、列表、其他对象等。ave
也可以返回多个值,并且如果返回的值的数量与输入向量的长度相匹配,它将这样做(可能是合理的)。例如ave(1:10,rep(1:2,each=5),FUN=rev)
。 - thelatemailrep(1:2, each=5)
,因为这样更容易识别各组内的反转。 - thelatemail