【问题标题】:aggregate a column by sum and another column by mean at the same time同时按总和聚合一列,按均值聚合另一列
【发布时间】:2013-02-21 00:30:38
【问题描述】:

我想在日期框架上使用聚合函数,但对一列求和并取另一列的平均值。

这是一个示例数据框

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 计算每平方英尺的成本

【问题讨论】:

  • 关于这种聚合类型的帖子太多了,在 SO 上的搜索无法超越您。

标签: r aggregate


【解决方案1】:

有几种方法可以做到这一点。以下是我喜欢的一些(假设我们从名为“mydf”的data.frame 开始):

使用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))

【讨论】:

    【解决方案2】:

    您可以在plyr 包中将summarise 函数与ddply 一起使用:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多