18

ネストされたリスト構造をデータフレームに変換しようとしています。リストは次のようになります (これは、httr パッケージを使用して読み込まれた、解析された JSON からシリアル化されたデータです)。

  myList <- list(object1 = list(w=1, x=list(y=0.1, z="cat")), object2 = list(w=NULL, x=list(z="dog")))

編集: 元のサンプル データは単純すぎました。実際のデータは不規則です。つまり、すべてのオブジェクトにすべての変数が存在するわけではなく、リスト要素の一部が NULL です。これを反映するようにデータを編集しました。

unlist(myList)リストを再帰的に平坦化する素晴らしい仕事をします。その後lapply、すべてのオブジェクトをうまく平坦化するために使用できます。

  flatList <- lapply(myList, FUN= function(object) {return(as.data.frame(rbind(unlist(object))))}) 

そして最後に、plyr::rbind.fill

  myDF <- do.call(plyr::rbind.fill, flatList)
  str(myDF)

  #'data.frame':    2 obs. of  3 variables:
  #$ w  : Factor w/ 2 levels "1","2": 1 2
  #$ x.y: Factor w/ 2 levels "0.1","0.2": 1 2
  #$ x.z: Factor w/ 2 levels "cat","dog": 1 2

問題は、w と xy が文字ベクトルとして解釈されるようになり、デフォルトでデータフレームの要素として解析されることです。それunlist()が原因だと思いますが、リスト構造を再帰的にフラット化する別の方法がわかりません。回避策は、データフレームを後処理してからデータ型を割り当てることです。ベクトルが有効な数値ベクトルまたは整数ベクトルかどうかを判断する最良の方法は何ですか?

4

6 に答える 6

16

hereで説明したように、値がas.numeric返さNAれるかどうかを確認することは、文字列に数値データが含まれているかどうかを確認する簡単な方法です。これで、次のようなことができます:

myDF2 <- lapply(myDF, function(col) {
  if (suppressWarnings(all(!is.na(as.numeric(as.character(col)))))) {
    as.numeric(as.character(col))
  } else {
    col
  }
})
str(myDF2)
# List of 3
#  $ w  : num [1:2] 1 2
#  $ x.y: num [1:2] 0.1 0.2
#  $ x.z: Factor w/ 2 levels "cat","dog": 1 2
于 2014-06-09T21:22:18.227 に答える
1

plyr::ldply が通常のベース R メソッドよりも優れているとは思えません。

 do.call(rbind, lapply(myList, data.frame) )
#-------------

        w x.y x.z
object1 1 0.1 cat
object2 2 0.2 dog

この問題は、データの固有の構造を考慮せずにデータを「平坦化」しようとする誤った試みが原因で発生していました。

于 2014-06-09T21:38:58.547 に答える
1

使用できますplyr::ldply

ldply(myList,.fun=function(x)data.frame(x))

      .id w x.y x.z
1 object1 1 0.1 cat
2 object2 2 0.2 dog
于 2014-06-09T21:27:27.720 に答える