使用data.table将一行data.frame转换为列名

时间:2013-05-13 16:50:33

标签: r dataframe data.table

我有一个500万行的大数据框,有三列。我想将其转换为矩阵,其行为USER_ID,ID为列,值为CNT。这可以通过meltcast

来完成
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来创建我想要的列联表。
有没有人知道如何使这个工作?我也在考虑用适当的尺寸创建和清空矩阵,并用适当的索引填充它。

2 个答案:

答案 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