EDIT
제가 data.table에 누락 된 행을 삽입하기위한 더 나은 방법이 포함 SO post을 알 수있다. 따라서 기능 fun_DT
은 으로 조정됩니다. 코드가 더 깨끗합니다. 그래도 어떤 속도 향상도 보이지 않는다. .
다른 게시물의 내용을 참조하십시오. Arun의 솔루션도 잘 작동하지만 누락 된 조합을 수동으로 삽입해야합니다. 여기에 식별자 열 (ID, Month)이 더 많으므로 여기서는 (ID2를 먼저 만든 다음 모든 ID2- 범주 조합을 만든 다음 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
테이블 본문에'수량 '을 채우겠습니까? 중복 조합 합계? – joran
@ joran : 필자의 예에서는 중복 된 조합이 있지만 인수를 위해 존재하지 않는다고 가정 할 수 있습니다. 내가 원하는 것은 범주 필드의 각 값에 대해 별개의 열로, NA 또는 누락 된 조합에 대해 0입니다. – Zach
@joran 질문에 대한 정답은 예라고 생각합니다. 카테고리가 누락 된 카테고리에 대해 각 열에 수량, 수량 또는 0으로, 그리고 중복이 합산되어야합니다. (하지만 합산을하기 전에 합산해야합니다. 재구성). – Zach