2010-01-14 13 views
32

Estoy tratando de aprender el paquete de R XML. Estoy tratando de crear un data.frame del archivo de datos books.xml xml data. Esto es lo que sale:Cómo transformar datos XML en un 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) 

Cada uno de estos xpathSApply de No me siquiera cerca de mi intención. ¿Cómo se debe proceder hacia un data.frame bien formado?

Respuesta

36

Normalmente, sugeriría probar la función xmlToDataFrame(), pero creo que esto en realidad será bastante complicado porque, para empezar, no está bien estructurado.

Yo recomendaría trabajar con esta función:

xmlToList(books) 

Un problema es que hay varios autores por el libro, por lo que tendrá que decidir cómo manejar eso cuando se está estructurando su trama de datos.

Una vez que haya decidido qué hacer con el problema de varios autores, es bastante sencillo convertir su lista de libros en un marco de datos con la función ldply() en plyr (o simplemente use lapply y convierta el valor devuelto en datos . .Frame utilizando do.call ("rbind" ...)

Aquí está un ejemplo completo (excluyendo autor):.

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 

Esto es lo que parece con el autor incluyó es necesario utilizar ldply en este caso, dado que la lista es "irregular" ... lapply no puede manejar eso correctamente. [De lo contrario, puede usar lapply con rbind.fill (también cortesía de Hadley), pero ¿por qué se molestan cuando plyr hace automáticamente por usted]:?

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

"? Pero ¿por qué molestarse cuando plyr hace automáticamente por usted" me encuentro diciendo que una gran cantidad . –

+0

Pregunta: en mi caso, el código produce un error "Error al cargar el recurso HTTP Error: 1: error al cargar el recurso HTTP". ¿Porqué es eso? – user2006697

+2

@ user2006697 el enlace se mueve a: "http://www.w3schools.com/xsl/books.xml" – zyurnaidi

Cuestiones relacionadas