Это расширение вопросов, задаваемых здесь: Агрегирование / суммирование нескольких переменных на группу (например, сумма, среднее) .
- В частности, если у меня несколько переменных на
aggregate
, есть ли способ изменить FUN
, каждая переменная агрегируется на?
Пример:
dat <- data.frame(ID = rep(letters[1:3], each =3), Plot = rep(1:3,3),Val1 = (1:9)*10, Val2 = (1:9)*20)
> dat
ID Plot Val1 Val2
1 a 1 10 20
2 a 2 20 40
3 a 3 30 60
4 b 1 40 80
5 b 2 50 100
6 b 3 60 120
7 c 1 70 140
8 c 2 80 160
9 c 3 90 180
#Aggregate 2 variables using the *SAME* FUN
aggregate(cbind(Val1, Val2) ~ ID, dat, sum)
ID Val1 Val2
1 a 60 120
2 b 150 300
3 c 240 480
- но обратите внимание, что обе переменные суммируются .
Что, если я хочу взять сумму от Val1 и среднее от Val2 ??
Лучшее решение, которое у меня есть:
merge(
aggregate(Val1 ~ ID, dat, sum),
aggregate(Val2 ~ ID, dat, mean),
by = c('ID')
)
- Но мне интересно, является ли это более чистым / коротким способом сделать это ...
Могу ли я сделать все это в Aggregate
???
- (в коде
aggregate
я ничего не видел, чтобы казалось, что это может сработать, но раньше я ошибался ...)
Пример # 2:
(как
запрошено , с использованием
mtcars
)
Reduce(function(df1, df2) merge(df1, df2, by = c('cyl','am'), all = T),
list(
aggregate(hp ~ cyl + am, mtcars, sum, na.rm = T),
aggregate(wt ~ cyl + am, mtcars, min),
aggregate(qsec ~ cyl + am, mtcars, mean, na.rm = T),
aggregate(mpg ~ cyl + am, mtcars, mean, na.rm = T)
)
)
#I'd want a straightforward alternative like:
aggregate(cbind(hp,wt,qsec,mpg) ~ cyl + am, mtcars, list(sum, min, mean, mean), na.rm = T)
# ^(I know this doesn't work)
Примечание: я бы предпочел базовый подход R, но я уже понимаю, dplyr
или какой-то другой пакет, вероятно, делает это "лучше"