【问题标题】:How to transform XML data into a data.frame?如何将 XML 数据转换为 data.frame?
【发布时间】:2011-01-05 05:50:08
【问题描述】:

我正在尝试学习 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 前进?

【问题讨论】:

    标签: xml r dataframe


    【解决方案1】:

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

    我建议使用此功能:

    xmlToList(books)
    

    一个问题是每本书有多个作者,因此在构建数据框时需要决定如何处理。

    一旦您决定如何处理多位作者问题,那么使用 plyr 中的 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>
    

    【讨论】:

    • “但是当 plyr 自动为你做这件事时,为什么还要麻烦呢?”我发现自己说了很多。
    • 问题:在我的情况下,代码产生错误“无法加载 HTTP 资源错误:1:无法加载 HTTP 资源”。这是为什么呢?
    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多