我有一个500万行的大数据框,有三列。我想将其转换为矩阵,其行为USER_ID,ID为列,值为CNT。这可以通过melt
和cast
或
xtabs(CNT ~ USER_ID + ID, data = foo)
然而,创建的对象很大,我收到以下错误'dim' specifies too large an array
USER_ID ID CNT
1 1.813e+14 21 1
2 1.559e+14 28 1
6 1.592e+14 71 2
我正在尝试使用data.table,因为接缝处理大数据比data.frame好得多,但我无法弄清楚如何使用data.table来创建我想要的列联表。
有没有人知道如何使这个工作?我也在考虑用适当的尺寸创建和清空矩阵,并用适当的索引填充它。
答案 0 :(得分:3)
使用内置的data.frame CO2
:
> xtabs(uptake ~ Treatment + Type, CO2)
Type
Treatment Quebec Mississippi
nonchilled 742.0 545.0
chilled 666.8 332.1
或类似地使用tapply
:
> with(CO2, tapply(uptake, list(Treatment, Type), sum))
Quebec Mississippi
nonchilled 742.0 545.0
chilled 666.8 332.1
现在与data.table进行比较:
> library(data.table)
>
> DT <- data.table(CO2)
> DT[, as.list(tapply(uptake, Type, sum)), by = Treatment]
Treatment Quebec Mississippi
1: nonchilled 742.0 545.0
2: chilled 666.8 332.1
警告说明:如果每个Type
组中都没有显示相同级别的Treatment
,那么这还不够。在这种情况下,有必要将Type
转换为数据表中的一个因子(因为它已经在CO2
中)。
增加:
它实际上可以摆脱tapply
并有一个像这样的纯数据表方法:
> DT[, setNames(as.list(.SD[,list(uptake = sum(uptake)), by = Type][, uptake]),
+ levels(Type)), by = Treatment]
Treatment Quebec Mississippi
1: nonchilled 742.0 545.0
2: chilled 666.8 332.1
上面的注意事项也适用于此。
答案 1 :(得分:2)
这是另一种方法(也使用CO2
数据集):
dt = data.table(CO2)
dt[, sum(uptake), by = list(Treatment, Type)][,
setNames(as.list(V1), paste(Type)), by = Treatment]
# Treatment Quebec Mississippi
#1: nonchilled 742.0 545.0
#2: chilled 666.8 332.1