簡體   English   中英

如何將XML數據轉換為data.frame?

[英]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無法正確處理。 [否則你可以使用lapplyrbind.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM