Агрегирование данных в R с пользовательской функцией

я сгруппировал данные в R с помощью метода aggregate.

Avg=aggregate(x$a, by=list(x$b,x$c),FUN= mean)

это дает мне среднее значение для всех значений "a", сгруппированных по " b " и " c "фрейма данных "x".

теперь вместо того, чтобы принимать среднее из всех значений "a", я хочу взять среднее из 3 максимальных значений "a", сгруппированных по " b " и "c".

пример набора данных

a    b    c
10   G    3 
20   G    3 
22   G    3
10   G    3 
15   G    3
25   G    3
30   G    3

после вышеуказанной агрегатной функции он даст мне

Group.1    Group.2    x
  G          3       18.85

но я хочу взять только максимум 5 значений " a " для среднего

Group.1    Group.2    x
  G          3       22.40

Я не в состоянии разместить ниже максимальную функцию, которую я использую в функции Agrregate

index <- order(vector, decreasing = T)[1:5]
vector(index)

может ли кто - нибудь пролить свет на то, как это возможно ?

1 ответов


вы можете заказать данные, получить верхние 5 записей (используя head), а затем применить среднее значение:

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

если вы хотите сделать это с помощью пользовательской функции, я бы сделал это так:

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

я на самом деле предпочитаю использовать стиль формулы в aggregate который будет выглядеть так (я также использую with() чтобы иметь возможность ссылаться на имена столбцов без использования x$ каждый раз):

with(x, aggregate(a ~ b + c, FUN= function(z) myfunc(z, 5)))
#  b c    a
#1 G 3 22.4

в этой функции, параметр z передается каждому a-вектор на основе групп b и c. Теперь это имеет смысл? Также обратите внимание, что здесь он возвращает не целое число, а числовое (десятичное, в данном случае 22.4) значение.