You can order data, get the top 5 records (using your head), and then apply the average value:
aggregate(x$a, by=list(x$b,x$c),FUN= function(x) mean(head(x[order(-x)], 5))) # Group.1 Group.2 x #1 G 3 22.4
If you want to do this with a special function, I would do it like this:
myfunc <- function(vec, n){ mean(head(vec[order(-vec)], n)) } aggregate(x$a, by=list(x$b,x$c),FUN= function(z) myfunc(z, 5)) # Group.1 Group.2 x #1 G 3 22.4
I really prefer to use the formula style in aggregate , which will look like this (I also use with() to be able to refer to column names directly without using x$ each time):
with(x, aggregate(a ~ b + c, FUN= function(z) myfunc(z, 5))) # bca #1 G 3 22.4
In this function, the parameter z is passed to each a -vector based on the groups b and c . Does that make more sense now? Also note that this does not return an integer, but a numeric (decimal, 22.4 in this case) value.
source share