5

APIのjsonデータからリストをdata.frameに変換しようとしています。fromJSONを使用して、ネストされたリスト構造を取得し、このデータを他のデータ フレームに結合する必要があります。

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

どんな助けでも大歓迎です!!!!

リストを作成するためのサンプル データは次のとおりです。

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

2 に答える 2

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. unlistネストされたリストのそれぞれをベクトルのリストに
  2. 親カテゴリが 1 つしかない場合は、「parent_categories」の名前を「parent_categories1」に変更します
  3. を使ってつなぎ合わせplyrますrbind.fill

いくつかの方法を使用して列の順序を並べ替えることができますが、それはかなり簡単です。

于 2013-08-28T19:53:54.340 に答える
1

これは私にはもう少し簡単に思えます:

  1. melt君のlist
  2. 「時間」変数を追加して、溶融中の L1 と L2 の一意の組み合わせを確保します。data.frame
  3. dcastワイドフォーマットを取得するために使用します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
于 2013-12-19T17:59:42.893 に答える