我在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数百万行和数百到数千种类别的东西.
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)
| 归档时间: |
|
| 查看次数: |
6579 次 |
| 最近记录: |