1

500 万行、3 列の大きなデータ フレームがあります。行としてUSER_ID、列としてID、CNTとして値を持つマトリックスに変換したいと思います。meltこれはand castorで行うことができます

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 に答える