2013-02-20 72 views
4

我想在日期框架上使用聚合函數,但總計一列並取另一列的平均值。同時聚合一列和另一列同時平均值

下面是一個例子的數據幀

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 

,這樣我可以通過做量/平方英尺

+1

只是有這種類型的太多帖子在SO上搜索的聚合不可能超過你。 – Arun 2013-02-20 16:28:20

回答

17

有幾種方法可以做到這一點計算每平方英尺的成本。下面是一些我喜歡的(假設所有我們開始了名爲 「是myDF」 data.frame):

使用aveunique

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") 

使用aggregatemerge

merge(aggregate(Amount ~ Manager, mydf, sum), 
     aggregate(SqFt ~ Manager, mydf, mean)) 
+1

完美。謝謝! – 2013-02-20 16:33:56

+1

@ M.Adams如果這完全回答你的問題,那麼請點擊答案旁邊的綠色勾號以提醒其他人已回答此問題,以便花費時間和精力回答你的問題的人獲得與該動作相關的聲譽獎勵。謝謝。 – 2013-02-20 17:19:22

+0

完成。按下綠色的刻度線。 – 2013-02-20 17:52:08

4

可以在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