2013-03-22 59 views
1

我有一張表,其中包含兩個因子列,我想將它們聚合到一個易於進行熱圖映射的表中。R中的二維聚合體? (創建熱圖)

此表具有例如具有以下格式

City   Date   Revenue  Costs  Manager 
____   ____   _______ ______  ___ 
New York  Feb 1   2000  200  Stuart 
San Fran  Feb 3   1200  300  John 
Boston  Feb 1   1500  400  Mike 
Boston  Feb 1   1300  200  Cissy 

等等

我想通過收入

Sum Revenue New York  San Fran  Boston 
____   ____   ____  ____ 
Feb 1  2000    0  2800 
Feb 2   0    0   0 
Feb 3   0    1200  0 

爲具有2-d聚集表以這種格式有沒有這樣做的簡單方法,或者我堅持使用循環?

+0

不僅重塑,按照日期聚集,城市,以及 – 2013-03-22 13:51:03

+0

謝謝阿倫,彙總+重塑這兩個簡單的步驟,節省了我寫很長的循環功能的麻煩。 – 2013-03-22 14:11:44

回答

3

正如@Arun在評論中建議,reshape會爲您做到這一點。

d<-read.table(text='City   Date   Revenue  Costs 
"New York"  "Feb 1"   2000  200 
"San Fran"  "Feb 3"   1200  300 
Boston  "Feb 1"   1500  400', header=TRUE) 
reshape(d[! names(d) %in% 'Costs'], idvar='Date', timevar='City', direction='wide') 
# Date Revenue.New York Revenue.San Fran Revenue.Boston 
# 1 Feb 1    2000    NA   1500 
# 2 Feb 3    NA    1200    NA 

如果有你想先結合起來,城市/日期多個條目,就可以使用aggregate

d<-read.table(text='City   Date   Revenue  Costs 
"New York"  "Feb 1"   2000  200 
"New York"  "Feb 1"   1000  100 
"San Fran"  "Feb 3"   1200  300 
Boston  "Feb 1"   1500  400', header=TRUE) 
dd<-with(d, aggregate(Revenue, by=list(City=City, Date=Date), sum)) 
#  City  Date x 
# 1 Boston Feb 1 1500 
# 2 New York Feb 1 3000 
# 3 San Fran Feb 3 1200 
ddd<-reshape(dd, idvar='Date', timevar='City', direction='wide') 
# Date x.Boston x.New York x.San Fran 
# 1 Feb 1  1500  3000   NA 
# 3 Feb 3  NA   NA  1200 

然後用0代替NA s。

ddd[is.na(ddd)] <- 0 
# Date x.Boston x.New York x.San Fran 
# 1 Feb 1  1500  3000   0 
# 3 Feb 3  0   0  1200 

爲了解決點@Arun下面帶來了,前面的步驟之前,你可以使用merge功能填補丟失的日期。

missing.Dates <- c('Feb 2') 
ddd<-merge(ddd, data.frame(Date=missing.Dates), by='Date', all=TRUE) 
# Date x.Boston x.New York x.San Fran 
#1 Feb 1  1500  3000   NA 
#2 Feb 3  NA   NA  1200 
#3 Feb 2  NA   NA   NA 
ddd[is.na(ddd)] <- 0 
#    Date x.Boston x.New York x.San Fran 
# 1 Feb 1     1500       3000          0 
# 2 Feb 3        0          0       1200 
# 3 Feb 2        0          0          0 
+0

問題與「2月2日」...(這可能意味着日期列必須生成爲日期..?) – Arun 2013-03-22 14:00:39

+0

這很好用!謝謝!! – 2013-03-22 14:10:34

+0

@Arun我想OP可以從一個空矩陣開始,填充所有的日期,然後覆蓋'ddd'數組中有匹配日期的每一行。 – 2013-03-22 14:14:43