我想在日期框架上使用聚合函数,但是对一列进行求和并取另一列的平均值。
这是一个示例数据框
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
这样我就可以通过金额/平方英尺来计算每平方英尺的成本
答案 0 :(得分:20)
有几种方法可以做到这一点。以下是我喜欢的一些(假设我们以名为“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))
答案 1 :(得分:4)
您可以在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