web-dev-qa-db-ja.com

XMLデータをdata.frameに変換する方法は?

RのXMLパッケージを学習しようとしています。 books.xmlサンプルxmlデータファイルからdata.frameを作成しようとしています。ここに私が得るものがあります:

library(XML)
books <- "http://www.w3schools.com/XQuery/books.xml"
doc <- xmlTreeParse(books, useInternalNodes = TRUE)
doc
xpathApply(doc, "//book", function(x) do.call(paste, as.list(xmlValue(x))))
xpathSApply(doc, "//book", function(x) strsplit(xmlValue(x), " "))
xpathSApply(doc, "//book/child::*", xmlValue)

これらのxpathSApplyはどれも、私の意図に近づくことさえできません。整形式のdata.frameに向けてどのように進むべきですか?

34
larus

通常、xmlToDataFrame()関数を試すことをお勧めしますが、最初は十分に構造化されていないため、これは実際にはかなりトリッキーになると思います。

この機能を使用することをお勧めします:

_xmlToList(books)
_

1つの問題は、1冊の本に複数の著者がいるため、データフレームを構造化するときに、その処理方法を決定する必要があることです。

複数の著者の問題をどう処理するかを決定したら、plyrでldply()関数を使用して書籍リストをデータフレームに変換する(または、lapplyを使用して戻り値をdo.call( "rbind" ...)を使用したdata.frame。

以下は完全な例です(著者を除く)。

_library(XML)
books <-  "w3schools.com/xsl/books.xml"
library(plyr)
ldply(xmlToList(books), function(x) { data.frame(x[!names(x)=="author"]) } )

   .id        title.text title..attrs year price   .attrs
 1 book  Everyday Italian           en 2005 30.00  COOKING
 2 book      Harry Potter           en 2005 29.99 CHILDREN
 3 book XQuery Kick Start           en 2003 49.99      WEB
 4 book      Learning XML           en 2003 39.95      WEB
_

これは著者が含まれている状態です。リストが「ギザギザ」になっているため、この場合はldplyを使用する必要があります... lapplyはそれを適切に処理できません。 [そうでない場合は、lapplyを_rbind.fill_と一緒に使用できます(これもHadleyの好意によるものです)が、plyrが自動的に実行するのに煩わしいのはなぜですか?]:

_ldply(xmlToList(books), data.frame)

   .id        title.text title..attrs              author year price   .attrs
1 book  Everyday Italian           en Giada De Laurentiis 2005 30.00  COOKING
2 book      Harry Potter           en        J K. Rowling 2005 29.99 CHILDREN
3 book XQuery Kick Start           en      James McGovern 2003 49.99      WEB
4 book      Learning XML           en         Erik T. Ray 2003 39.95      WEB
     author.1   author.2   author.3               author.4
1        <NA>       <NA>       <NA>                   <NA>
2        <NA>       <NA>       <NA>                   <NA>
3 Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan
4        <NA>       <NA>       <NA>                   <NA>
_
39
Shane