我正在尝试学习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中的每一个都没有让我接近我的意图。如何进入格式良好的数据框架?
答案 0 :(得分:38)
通常情况下,我建议尝试使用xmlToDataFrame()
函数,但我相信这实际上相当棘手,因为它的结构不合理。
我建议使用此功能:
xmlToList(books)
一个问题是每本书有多个作者,因此在构建数据框时需要决定如何处理。
一旦您决定如何处理多个作者问题,那么将您的图书清单转换为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>