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に向けてどのように進むべきですか?
通常、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>
_