What is the difference between the functions tapply and ave?
Asked Answered
G

1

6

I can't wrap my mind around the ave function. I read the help and searched the net but I still cannot understand what it does. I understand it applies some function on a subset of observation but not in the same way as for example tapply

Could someone please enlighten me perhaps with a small example?

Thanks, and excuse me for perhaps an unusual request.

Genuine answered 9/3, 2014 at 22:47 Comment(0)
A
13

tapply returns a single result for each factor level. ave also produces a single result per factor level, but it copies this value to each position in the original data.

ave is handy for producing a new column in a data frame with summary data.

A short example:

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

One value, the mean for each factor level.

ave on iris produces 150 results, which line up with the original data frame:

 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

As noted in the comments, here the single value is being recycled to fill each location in the original data.

If the function returns multiple values, these are recycled if necessary to fill in the locations. For example:

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

Thanks to Josh and thelatemail.

Ashraf answered 9/3, 2014 at 22:55 Comment(5)
Oops. Posted my own answer (now deleted) without seeing yours. I'd suggest one minor correction, which is that neither ave nor tapply need produce a single result per factor level. Set FUN=cumsum, or some such, to see that.Thermochemistry
tapply does produce a single result per factor level. This result may just be multiple values, lists, other objects etc. ave can also return multiple values, and will do so (possibly sensibly) if the number of values returned matches up with the length of the input vector. e.g. ave(1:10,rep(1:2,each=5),FUN=rev)Coonskin
I'd suggest using rep(1:2, each =5) for the example. It makes it easier to identify the reversing within the groups.Coonskin
@Coonskin Yes, that is better.Ashraf
It could also be confused with the aggregate functionLieutenancy

© 2022 - 2024 — McMap. All rights reserved.