34

XMLRのパッケージを学ぼうとしています。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 に向けてどのように進めるべきですか?

4

1 に答える 1

39

通常は、xmlToDataFrame()関数を試してみることをお勧めしますが、そもそもうまく構成されていないため、これは実際にはかなりトリッキーになると思います。

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

xmlToList(books)

1 つの問題は、書籍ごとに複数の著者が存在することです。そのため、データ フレームを構造化する際に、それを処理する方法を決定する必要があります。

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

完全な例を次に示します (作成者を除く):

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はそれを適切に処理できません。[それ以外の場合はlapplywithを使用できます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>
于 2010-01-14T20:07:37.600 に答える