編輯
我發現這個SO post,其中包括更好的方式向 缺少的行插入到data.table。功能fun_DT
相應地調整 。現在代碼更清潔了;雖然我沒有看到速度改善 。
看到其他職位我更新。 Arun的解決方案也適用,但您必須手動插入缺失的組合。由於你在這裏有更多的標識符列(ID,Month),所以我在這裏只提出了一個骯髒的解決方案(首先創建一個ID2,然後創建所有的ID2-Category組合,然後填充data.table,然後進行重塑)。
我敢肯定這是不是最好的解決辦法,但如果this FR是內置的,這些步驟可以自動完成。
的解決方案是大致相同的速度明智的,儘管它會看到如何擴展(我的機器太慢很有趣,所以我不希望任何進一步增加n個...電腦死機往往已經;-)
library(data.table)
library(rbenchmark)
fun_reshape <- function(n) {
DT <- data.table(
ID=sample(1:100, n, replace=TRUE),
Month=sample(1:12, n, replace=TRUE),
Category=sample(1:10, n, replace=TRUE),
Qty=runif(n)*500,
key=c('ID', 'Month')
)
agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
reshape(agg, v.names = "Qty", idvar = c("ID", "Month"),
timevar = "Category", direction = "wide")
}
#UPDATED!
fun_DT <- function(n) {
DT <- data.table(
ID=sample(1:100, n, replace=TRUE),
Month=sample(1:12, n, replace=TRUE),
Category=sample(1:10, n, replace=TRUE),
Qty=runif(n)*500,
key=c('ID', 'Month')
)
agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
agg[, ID2 := paste(ID, Month, sep="_")]
setkey(agg, ID2, Category)
agg <- agg[CJ(unique(ID2), unique(Category))]
agg[, as.list(setattr(Qty, 'names', Category)), by=list(ID2)]
}
library(rbenchmark)
n <- 1e+07
benchmark(replications=10,
fun_reshape(n),
fun_DT(n))
test replications elapsed relative user.self sys.self user.child sys.child
2 fun_DT(n) 10 45.868 1 43.154 2.524 0 0
1 fun_reshape(n) 10 45.874 1 42.783 2.896 0 0
你的意思是用'Qty'填充表格的正文嗎?總結任何重複的組合? – joran 2013-04-04 22:19:48
@joran:在我的例子中有重複的組合,但爲了爭論,讓我們假設沒有。我想要的是對於類別字段的每個值都有一個不同的列,其中NA或0表示缺失的組合。 – Zach 2013-04-04 22:23:33
@joran我認爲你的問題的正確答案是肯定的:我希望類別成爲一列,每列中包含數量,缺失類別爲NAs或0,重複數據應該總結(但在我們之前進行總結是公平的)重塑)。 – Zach 2013-04-05 14:30:02