EDIT
私はdata.tableに 欠落している行を挿入するためのより良い方法を含む、このSO postを見つけました。それに応じて機能fun_DT
が に調整されます。コードは現在よりクリーンです。私は速度の改善が表示されません しかし。
他の投稿で私の更新を見てください。 Arunのソリューションも同様ですが、手動で欠落した組み合わせを挿入する必要があります。ここでは識別子列がより多いので(ID、月)、ID2を最初に作成し、すべてのID2カテゴリの組み合わせを作成してから、data.tableを埋めるようにしてから、再構成を行います。
私はこれが最良の解決策ではないと確信していますが、this FRが組み込まれている場合、これらの手順は自動的に行われる可能性があります。
解決策は、スケールがどのように低すぎるのか興味深いですが、おおよそ同じスピードですが、私のマシンは遅すぎますので、これ以上は増やしたくありません。 ;-)
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
@ joran:私の例では重複した組み合わせがありますが、引数のために、そうでないと仮定できます。私が欲しいのは、カテゴリー・フィールドの各値のための別個の列です。 – Zach
@joranあなたの質問への正しい答えは「はい」だと思います。カテゴリが列になるようにしたい、列ごとに数量、欠落したカテゴリにNAsまたは0sを追加し、重複を合計する必要があります(ただし、再形成)。 – Zach