2010-01-14 101 views
32

我正试图学习R的XML包。我试图从books.xml示例xml数据文件创建一个data.frame。这里是我得到的:如何将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的每一个都没有让我接近我的意图。应该如何进行一个良好的数据框?

回答

36

通常,我会建议尝试使用xmlToDataFrame()函数,但我相信这实际上会相当棘手,因为它的结构并不完善。

我会建议使用此功能工作:

xmlToList(books) 

的一个问题是,有每本书多个作者,所以你需要决定如何处理,当你构建你的数据帧。

一旦你决定了如何处理多个作者的问题,那么它是相当直接的将您的书籍列表转换为plyr中ldply()函数的数据框(或者只是使用lapply并将返回值转换为数据通过使用do.call(“rbind” ...).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无法正确处理。[否则可以使用lapplyrbind.fill(也哈德利提供),但何必当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> 
+7

“?但为什么还要当plyr自动为您完成”我发现自己说,一个可怕的很多。 – 2010-01-14 20:32:29

+0

问题:在我的情况下,代码产生一个错误“未能加载HTTP资源错误:1:未能加载HTTP资源”。这是为什么? – user2006697 2016-03-11 07:53:19

+2

@ user2006697将链接移至:“http://www.w3schools.com/xsl/books.xml” – zyurnaidi 2016-05-21 04:03:47