2011-11-18 57 views
5

我一定在做錯事,因爲這個功能還沒有完成。聚合創建需要很長時間的頻率矩陣

我想按周彙總一些數據。數據被分解爲id和weeknumber。我希望結果有id作爲行,周作爲列,總計作爲值。

的是我到目前爲止已經試過

例(嘗試了一堆其他東西,包括加入虛擬變量= 1,然後fun.aggregating =總和超過那個):

ddply(data, .(id), dcast, id~weeknumber, value_var="id", 
     fun.aggregate=length, fill=0, .parallel=TRUE) 

有沒有更好的如何做到這一點?

輸入:

id  week 
1  1 
1  2 
1  3 
1  1 
2  3 

輸出:

1 2 3 
1 2 1 1 
2 0 0 1 

回答

10

你不需要ddply這一點。從reshape2dcast足夠:

dat <- data.frame(
    id = c(rep(1, 4), 2), 
    week = c(1:3, 1, 3) 
) 

library(reshape2) 
dcast(dat, id~week, fun.aggregate=length) 

    id 1 2 3 
1 1 2 1 1 
2 2 0 0 1 

編輯:對於基礎R解決方案(比table其他 - 張貼由Joshua Uhlrich),嘗試xtabs

xtabs(~id+week, data=dat) 

    week 
id 1 2 3 
    1 2 1 1 
    2 0 0 1 
12

你可以只需使用table命令:

table(data$id,data$week) 

    1 2 3 
    1 2 1 1 
    2 0 0 1 
+0

+1爆炸。你有訣竅讓我的解決方案看起來完全囉嗦,迂迴和行人。 – Andrie

+2

如果您有很多數據和操作無法簡化,那麼'data.table'包可能會對您有所幫助。 –

6

ddply需要這麼長時間的原因是組的分裂並不是平行運行(只有'分裂'上的計算),因此對於大量的組它會很慢(和.parallel = T)將不會幫助。

A data.table方法應該在時間和記憶上非常有效。

對於data.table效率最好是在形式的合作,做分組,然後重塑寬

library(data.table) 
library(reshape2) 
DT <- data.table(data) 

setkeyv(DT, 'id') 

dcast(DT[, .N, by = list(id, week)], id~ week, fill = 0)