透视大数据.表格

Zac*_*ach 8 r data.table

我在R中有一个大数据表:

library(data.table)
set.seed(1234)
n <- 1e+07*2
DT <- data.table(
  ID=sample(1:200000, n, replace=TRUE), 
  Month=sample(1:12, n, replace=TRUE),
  Category=sample(1:1000, n, replace=TRUE),
  Qty=runif(n)*500,
  key=c('ID', 'Month')
)
dim(DT)
Run Code Online (Sandbox Code Playgroud)

我想调整这个data.table,使Category成为一个列.不幸的是,由于组内的类别数量不恒定,我不能使用这个答案.

我有什么想法可以做到这一点?

/编辑:基于joran的评论和flodel的回答,我们正在重塑以下内容data.table:

agg <- DT[, list(Qty = sum(Qty)), by = c("ID", "Month", "Category")]
Run Code Online (Sandbox Code Playgroud)

这种重塑可以通过多种方式实现(到目前为止我已经得到了一些好的答案),但我真正想要的是能够很好地扩展到data.table数百万行和数百到数千种类别的东西.

Aru*_*run 9

data.table实现更快版本的melt/dcastdata.table特定方法(在C中).它还增加了熔化和铸造多个色谱柱的附加功能.请参阅使用data.tables晕影的高效重塑.

请注意,我们不需要加载reshape2包.

library(data.table)
set.seed(1234)
n <- 1e+07*2
DT <- data.table(
  ID=sample(1:200000, n, replace=TRUE), 
  Month=sample(1:12, n, replace=TRUE),
  Category=sample(1:800, n, replace=TRUE), ## to get to <= 2 billion limit
  Qty=runif(n),
  key=c('ID', 'Month')
)
dim(DT)

> system.time(ans <- dcast(DT, ID + Month ~ Category, fun=sum))
#   user  system elapsed
# 65.924  20.577  86.987
> dim(ans)
# [1] 2399401     802
Run Code Online (Sandbox Code Playgroud)