編集:この質問は時代遅れです。jsonliteパッケージは自動的にフラット化されます。
私は、通常はJSONで、レコードベースのエンコーディングを持つオンラインデータストリームを扱っています。オブジェクトの構造(つまり、JSON内の名前)はAPIドキュメントからわかりますが、値はほとんどオプションであり、すべてのレコードに存在するわけではありません。リストには新しいリストを含めることができ、構造が非常に深い場合があります。これはいくつかのGPSデータの非常に簡単な例です:http://pastebin.com/raw.php?i=yz6z9t25。"l"
下の行では、 GPS信号がないため、オブジェクトが欠落していることに注意してください。
これらのオブジェクトをデータフレームにフラット化するためのエレガントな方法を探しています。私は現在次のようなものを使用しています:
library(RJSONIO)
library(plyr)
obj <- fromJSON("http://pastebin.com/raw.php?i=yz6z9t25", simplifyWithNames=FALSE, simplify=FALSE)
flatdata <- lapply(obj$data, as.data.frame);
mydf <- rbind.fill(flatdata)
これでうまくいきますが、速度が遅く、エラーが発生しやすくなります。このアプローチの問題は、データの構造(オブジェクト名)に関する知識を使用していないことです。代わりに、データから推測されます。これは、特定のプロパティがすべてのレコードに存在しない場合に問題を引き起こします。この場合、NA値の列ではなく、データフレームにまったく表示されません。これは、ダウンストリームの問題につながる可能性があります。たとえば、場所のタイムスタンプを処理する必要があります。
mydf$l.t <- structure(mydf$l.t/1000, class="POSIXct")
l$t
ただし、オブジェクトが存在しないデータセットの場合、これによりエラーが発生します。さらに、as.data.frame
との両方がrbind.fill
物事をかなり遅くします。サンプルデータセットは比較的小さいものです。より良い実装のための提案はありますか?堅牢なソリューションでは、常に同じ列が同じ順序であり、行数のみが変化するデータフレームが生成されます。
編集:より多くのメタデータを含むデータセットの下。サイズが大きく、ネストが深くなっています。
obj <- fromJSON("http://www.stat.ucla.edu/~jeroen/files/output.json", simplifyWithNames=FALSE, simplify=FALSE)