2013-08-28 11 views
5

apiのjsonデータからリストをdata.frameに変換しようとしています。 fromJSONを使用して、ネストされたリスト構造を取得し、このデータを他のいくつかのデータフレームに参加させる必要があります。複数のリスト要素をdata.frame列を区切るように変換する

したがって、リストは多次元(ネストされた)の並べ替えです。私は、他のフレームの構造と一致させて結合を行うため、複数の要素をdata.frameの別々の列に変換しようとしていました。私はこれを行うためのエレガントな方法があると確信していますが、私は1つを見つけるように見えません。最悪の場合、ループにはを使用することになります。

ご迷惑をおかけしますようお願い申し上げます。ここで

リストを作成するためのサンプルデータです:

mylist <- list(structure(list(
     categoryName = "cat1", 
     parent_categories = "parent1", 
     url = "/xyx.com/bca/"), 

     .Names = c("categoryName", "parent_categories", "url")), 

     structure(list(
     categoryName = "cat2", 
     parent_categories = c("parent2", "parent3", "parent4"), 
     url = "/abc.com/bca"), 

     .Names = c("categoryName", "parent_categories", "url")) 
    ) 

私が欲しいの出力は以下は、この

categoryName parent_categories_1 parent_categories_2 parent_categories_3 url 
1   cat1   parent1   NA   NA     /xyx.com/bca/ 
2   cat2   parent2   parent3  parent4   /abc.com/bca 

のようになります。私が使用されるが取得していないものです望む結果は非常に近いものの、

ldply(mylist, function(x){ data.frame(x) }) 

    **MY CURRENT OUTPUT** 

     categoryName parent_categories   url 
    1   cat1   parent1 /xyx.com/bca/ 
    2   cat2   parent2 /abc.com/bca 
    3   cat2   parent3 /abc.com/bca 
    4   cat2   parent4 /abc.com/bca 

答えて

4

は、ここに1つのアプローチだが、私は良い方法があります確信している:

mylist2 <- lapply(lapply(mylist, unlist), function(x) { 
    names(x)[names(x) == "parent_categories"] <- "parent_categories1" 
    data.frame(t(x)) 
}) 

library(plyr) 
rbind.fill(mylist2) 

## categoryName parent_categories1   url parent_categories2 parent_categories3 
## 1   cat1   parent1 /xyx.com/bca/    <NA>    <NA> 
## 2   cat2   parent2 /abc.com/bca   parent3   parent4 

説明:

  1. I unlistネストされたリストの各ベクトルのリストへ
  2. 私は名前の変更」親カテゴリが1つしかない場合は「parent_categories」から「parent_categories1」へ
  3. plyrrbind.fillを使用してそれをスプライスするエーテル

いくつかのアプローチを使用して列の順序を並べ替えることはできますが、それはかなり単純です。

+0

迅速な対応をありがとう!これはトリックを行うようだ。実際に私は私のldplyで** Transpose **を使用することを認識していませんでした。それ以外の場合は、カンマなどで列の文字列を分割できます。 –

1

これは私にはもう少し簡単なようだ:

  1. meltあなたlist
  2. は、取得するために、溶融data.frame
  3. 使用dcastでL1とL2のユニークな組み合わせを確実にするために「時間」変数を追加します。あなたのワイドフォーマットdata.frame

library(reshape2) 
x <- melt(mylist) 
x$time <- with(x, ave(L2, L1, L2, FUN = seq_along)) 
dcast(x, L1 ~ L2 + time, value.var="value") 
# L1 categoryName_1 parent_categories_1 parent_categories_2 parent_categories_3   url_1 
# 1 1   cat1    parent1    <NA>    <NA> /xyx.com/bca/ 
# 2 2   cat2    parent2    parent3    parent4 /abc.com/bca 
関連する問題