Агрегирование данных в 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) значение.