9

ハッシュのリストを提供する JSON データ ソースがあります。

[
  { "a": "foo",
    "b": "sdfshk"
  },
  { "a": "foo",
    "b": "ihlkyhul"
  }
]

パッケージで使用fromJSON()して、rjsonそれを R データ構造に変換します。戻り値:

list(
  structure(list(a = "foo", b = "sdfshk"), .Names = c("a", "b")),
  structure(list(a = "foo", b = "ihlkyhul"), .Names = c("a", "b"))
)

これをRデータ フレームに入れる必要がありますdata.frame()が、予想どおり 2x2 データ フレームではなく、4 列の単一行データ フレームに変換します。簡単なように見えますが、一方から他方への変換を行うための R-fu がありません。

ボーナスポイント:

JSON データ ソースは上記のように規則的ではないため、実際の問題はもう少し複雑です。返されるオブジェクトのタイプはさまざまです。つまり、それぞれに設定されたフィールドは、いくつかの異なるタイプのいずれかになります。

[
  { "a": "foo",
    "b": "asdfhalsdhfla"
  },
  { "a": "bar",
    "c": "akjdhflakjhsdlfkah",
    "d": "jfhglskhfglskd",
  },
  { "a": "foo",
    "b": "dfhlkhldsfg"
  }
]

ご覧のとおり、各オブジェクトの「a」フィールドは type タグであり、オブジェクトが持つその他のフィールドを示します。

ソリューションがこれにどのように対処するかについては、あまり詳しくありません。

2 つのオブジェクト タイプが単に一緒になっていても、列 a、b、c、および d が得られ、JSON ソース オブジェクトが特定の値を持たない場合、行には単にN/Aorの値が含まれていても問題はありません。NULL分野。で結果のデータフレームをきれいにできると思いますsubset(df, a == "foo")。そのようにしていくつかの空の列ができてしまいますが、それは私のプログラムには関係ありません。

どの JSON ソース行がデータ フレームに入れられ、どの JSON ソース行が拒否されるかを選択する方法をソリューションが提供して、実際に必要な列と行のみが結果に含まれるようにすることをお勧めします。

4

1 に答える 1

11

data.frame に変換したいギザギザのリストがある場合は、Hadley の plyr を使用できますrbind.fill。何度か首を救った。これがあなたが探しているものかどうか教えてください。最初の例を修正して、3 番目の要素に「b」のみを含めてギザギザにしたことに注意してください。

> x <- list(
+         structure(list(a = "foo", b = "sdfshk"), .Names = c("a", "b")),
+         structure(list(a = "foo", b = "ihlkyhul"), .Names = c("a", "b")),
+         structure(list(b = "asdf"), .Names = "b")
+ )
> 
> library(plyr)
> do.call("rbind.fill", lapply(x, as.data.frame))
     a        b
1  foo   sdfshk
2  foo ihlkyhul
3 <NA>     asdf
于 2012-09-20T08:47:36.980 に答える