[英]How to transform XML data into a 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中的每一個都沒有讓我接近我的意圖。 如何進入格式良好的數據框架?
通常,我建議嘗試使用xmlToDataFrame()
函數,但我相信這實際上會非常棘手,因為它的結構xmlToDataFrame()
。
我建議使用這個功能:
xmlToList(books)
一個問題是每本書有多個作者,因此在構建數據框時需要決定如何處理。
一旦你決定如何解決多個作者的問題,那么將你的圖書列表變成ldply()
函數就可以了(或者只是使用lapply並將返回值轉換為data.frame)。通過使用do.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無法正確處理。 [否則你可以使用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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.