我试图学习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,function(x) strsplit(xmlValue(x)," ")) xpathSApply(doc,"//book/child::*",xmlValue)
这些xpathSApply的每个都不让我甚至接近我的意图。如何进行一个良好的数据框架?
通常,我建议尝试xmlToDataFrame()函数,但我相信这实际上是相当棘手的,因为它不是很好的结构开始。
我建议使用此功能:
xmlToList(books)
一个问题是每本书有多个作者,所以你需要决定在构造数据框架时如何处理。
一旦你决定了如何处理多个作者的问题,那么相当简单的方法是使用plyr中的ldply()函数将你的图书列表变成一个数据框架(或者只是使用lapply并将返回值转换为data.frame通过使用do.call(“rbind”…)。
这里有一个完整的例子(不包括作者):
library(XML) books <- "http://www.w3schools.com/XQuery/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,因为列表是“jagged”… lapply不能正确处理。 [否则你可以使用lapply与rbind.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>