5

リストのコレクションを扱っています。これには、次の事実以外に固定構造のない、深くネストされたリストが含まれています。

  1. レベル 1 のリストには、variations
  2. 階層内のすべてのリーフ データは数値です。

例えば:

list(
  list(variations = list(
    '12'   = list(x = c(a = 1))
    )),
  list(variations = list(
    '3'    = list(x = c(a = 6, b = 4)),
    'abcd' = list(x = c(b = 1), m = list(n = list(o = c(p = 1023))))
    ))
  )

リストのデータ構造をreshape、フォームの融解した (per の) データフレームに変換する必要があります。

data.frame(
  variation = c( '12',   '3',   '3', 'abcd',    'abcd'),
  variable  = c('x.a', 'x.a', 'x.b',  'x.b', 'm.n.o.p'),
  value     = c(    1,     6,     4,      1,      1023)
  )

または、高速なグループ化とフィルタリングを実行できる別のデータ構造。

データ構造には何百万ものノードがあります。コレクションには数千のエントリを含めることができ、各エントリには数万のバリエーションがあり、名前が不明な 2 ~ 10 以上のリーフ ノードがあります。

コレクションからデータフレームをすばやく構築する方法についての提案を探しています。

1つのアプローチはunlist、ソースデータで使用してリストを平坦化することですが、次のことについてはわかりません:

  • unlistリーフ数値ノードを文字列に変換するデータ構造全体で実行する必要がありますか (これを解析して数値に戻す必要があります)、またはunlist各バリエーションで使用する必要があります (数値リーフ ノードはそのまま残します)。

  • あまり多くの中間値を生成せずに、値unlistを抽出するために作成される長い名前を解析する良い方法は何ですか?variationvariable

正しい方法であるかどうかに関係なくunlist、私は疑問に思っています:

  • データフレームを行ごとに構築するのではなく、個別variationの 、variableおよびベクトルまたは行列を構築してから、それらをデータフレームに結合する方が良いですか?value

  • このタイプのデータを処理するために、データフレームを使用するのではなく、別のより高速なデータ構造を使用する必要がありますか? 最終的に使用するものはすべて、plyrreshapeおよびで使用するためにデータフレームに変換できる必要がありggplotます。

4

1 に答える 1

3

rapplyリストを再帰的に操作する、あまり使用されていないように見える関数があります。私はそれがどれほど速いかわかりません (に基づいているlapplyので、おそらくひどいわけではありませんが、驚くべきことではありません)。しかし、エレガンスのためだけなら、検討する価値があります。

以下は、その使用の基本的な例の 1 つです。

> rapply( test, classes="numeric", how="unlist", f=function(var) data.frame(names(var),var) )
      variations.12.x.names.var.              variations.12.x.var       variations.3.x.names.var.1       variations.3.x.names.var.2              variations.3.x.var1 
                             "a"                              "1"                              "a"                              "b"                              "6" 
             variations.3.x.var2     variations.abcd.x.names.var.            variations.abcd.x.var variations.abcd.m.n.o.names.var.        variations.abcd.m.n.o.var 
                             "4"                              "b"                              "1"                              "p"                           "1023" 
于 2012-12-18T10:42:50.630 に答える