【发布时间】:2014-03-09 22:47:25
【问题描述】:
我无法将注意力集中在ave 函数上。我阅读了帮助并搜索了网络,但我仍然无法理解它的作用。我知道它在观察子集上应用了一些功能,但与 tapply
有人可以举个小例子来启发我吗?
谢谢,请原谅我提出了一个不寻常的要求。
【问题讨论】:
我无法将注意力集中在ave 函数上。我阅读了帮助并搜索了网络,但我仍然无法理解它的作用。我知道它在观察子集上应用了一些功能,但与 tapply
有人可以举个小例子来启发我吗?
谢谢,请原谅我提出了一个不寻常的要求。
【问题讨论】:
tapply 为每个因子水平返回一个结果。 ave 也会为每个因子级别生成一个结果,但它会将这个值复制到原始数据中的每个位置。
ave 可以方便地在包含摘要数据的数据框中生成新列。
一个简短的例子:
tapply(iris$Sepal.Length, iris$Species, FUN=mean)
setosa versicolor virginica
5.006 5.936 6.588
一个值,每个因子水平的平均值。
ave on 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
如 cmets 中所述,此处将回收单个值以填充原始数据中的每个位置。
如果函数返回多个值,则在必要时将这些值回收以填充位置。例如:
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 或类似的,以查看。
tapply 确实会在每个因子水平上产生一个结果。这个结果可能只是多个值、列表、其他对象等。ave 也可以返回多个值,并且如果返回的值的数量与输入向量的长度匹配,就会这样做(可能是明智的)。例如ave(1:10,rep(1:2,each=5),FUN=rev)
rep(1:2, 每个 =5) 为例。它可以更轻松地识别组内的倒车。