0

次のようなデータフレームがあります。

      V1     V2     LABEL
    1 83965 891552   A
    2 88599 891552   B
    3 42966 891552   C
    4 83965 891553   D
    5 88599 891553   D
    6 42966 891553   B

どうすれば隣接行列のようなものに変換できますが、列行の交差点で、3番目の列値が必要です。

        891552 891553
  42966      C      B
  83965      A      D
  88599      B      D

@ヘンリック

このようなエラーが発生しました。このセグメントフォルトは、データのサイズが大きいことが原因だと思います。

Using label as value column: use value.var to override.
Aggregation function missing: defaulting to length

 *** caught segfault ***
address 0x7fff1e099a90, cause 'memory not mapped'

Traceback:
 1: .Call("split_indices", group, as.integer(n))
 2: split_indices(.group, .n)
 3: vaggregate(.value = value, .group = overall, .fun = fun.aggregate,     ..., .default = fill, .n = n)
 4: cast(data, formula, fun.aggregate, ..., subset = subset, fill = fill,     drop = drop, value.var = value.var)
 5: dcast(dat, item ~ worker)
Any idead how it is possible to get rid of it?

R の試行をあきらめ、Python を使用しました。これは、tapply、dcast、reshape、cast のすべてのソリューションのパフォーマンスが非常に悪く、システム全体が何時間もハングアップしたためです。

しかし: 巨大なデータを効果的に処理できる解決策を知っている場合は、お知らせください。

4

2 に答える 2

3

data.tableパッケージを使用してみてください。を使用して、実際にbaseRでこの種の再形成を行うことができtapplyます。これは、上で動作するため高速である必要がありdata.tableます...

require(data.table)
DT <- data.table(df)
tapply(DT$LABEL , list(DT$V1,DT$V2) , as.character )

#      891552 891553
#42966 "C"    "B"   
#83965 "A"    "D"   
#88599 "B"    "D" 

うまくいけば、それは速いでしょう。

于 2013-09-18T22:15:46.253 に答える