1

我有一个 500 万行、三列的大型数据框。我想将它转换为一个矩阵,它的行为 USER_ID,ID 为列,值为 CNT。这可以用meltandcast

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 创建我想要的列联表。
有谁知道如何让它工作?我也在考虑创建具有适当尺寸的空矩阵并用适当的索引填充它。

4

2 回答 2

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

上面的警告也适用于此。

于 2013-05-13T17:44:45.773 回答
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
于 2013-05-13T17:57:59.050 回答