Вопрос:

агрегировать столбец по сумме и другой столбец по среднему значению одновременно

r aggregate

12158 просмотра

2 ответа

70 Репутация автора

Я хочу использовать агрегатную функцию для фрейма даты, но суммировать один столбец и брать среднее значение для другого столбца.

Вот пример фрейма данных

Manager   Category  Amount  SqFt
Joe           Rent     150   500
Alice         Rent     250   700
Joe      Utilities      50   500
Alice    Utilities      75   700

Я не могу сделать что-то вроде ниже. Есть ли простой способ сделать это?

Avg_CPSF=aggregate(cbind(Amount,SqFt)~Manager,data=aaa,FUN=c(sum,mean)

В конце концов мне нужно

Manager  Amount   SqFT
Joe       200      500
Alice     325      700

так что я могу рассчитать стоимость за квадратный фут, выполнив Amount / SqFT

Автор: M.Adams Источник Размещён: 20.02.2013 04:12

Ответы (2)


20 плюса

160249 Репутация автора

Решение

Есть несколько способов сделать это. Вот некоторые из них, которые мне нравятся (все при условии, что мы начинаем с data.frameимени "mydf"):

Использование aveиunique

unique(within(mydf, {
  Amount <- ave(Amount, Manager, FUN = sum)
  SqFt <- ave(SqFt, Manager, FUN = mean)
  rm(Category)
}))
#   Manager Amount SqFt
# 1     Joe    200  500
# 2   Alice    325  700

Использование data.table:

library(data.table)
DT <- data.table(mydf)
DT[, list(Amount = sum(Amount), SqFt = mean(SqFt)), by = "Manager"]
#    Manager Amount SqFt
# 1:     Joe    200  500
# 2:   Alice    325  700

Использование "sqldf":

library(sqldf)
sqldf("select Manager, sum(Amount) `Amount`, 
      avg(SqFt) `SqFt` from mydf group by Manager")

Использование aggregateи merge:

merge(aggregate(Amount ~ Manager, mydf, sum), 
      aggregate(SqFt ~ Manager, mydf, mean))
Автор: A5C1D2H2I1M1N2O1R2T1 Размещён: 20.02.2013 04:18

4 плюса

54478 Репутация автора

Вы можете использовать summariseфункцию ddplyв plyrпакете:

library(plyr)
ddply(mtcars,.(cyl),summarise,TotalWt=sum(wt),AveHP=mean(hp))
  cyl TotalWt     AveHP
1   4  25.143  82.63636
2   6  21.820 122.28571
3   8  55.989 209.21429
Автор: James Размещён: 20.02.2013 04:22
Вопросы из категории :
32x32