Question

Je suis en train d'apprendre le paquet XML de R. Je suis en train de créer un data.frame partir d'un échantillon de books.xml fichier de données XML. Voici ce que je reçois:

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)

Chacun de ces xpathSApply de ne pas me obtenir même près de mon intention. Comment doit-on procéder vers un data.frame bien formé?

Était-ce utile?

La solution

Ordinairement, je suggère d'essayer la fonction xmlToDataFrame(), mais je crois que cela va effectivement être assez délicat car il est pas bien structuré pour commencer.

Je recommande de travailler avec cette fonction:

xmlToList(books)

Un problème est qu'il ya plusieurs auteurs par livre, vous aurez donc besoin de décider comment gérer que lorsque vous structurez votre trame de données.

Une fois que vous avez décidé quoi faire avec la question plusieurs auteurs, il est avant de tourner assez droite votre liste de livres dans une trame de données avec la fonction ldply() dans plyr (ou tout simplement utiliser lapply et convertir la valeur de retour en données. cadre en utilisant do.call ( "rbind" ...).

Voici un exemple complet (auteur exclusion):

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

Voici à quoi il ressemble avec l'auteur inclus. Vous devez utiliser ldply dans ce cas puisque la liste est « en dents de scie » ... lapply ne peut pas gérer correctement. [Sinon, vous pouvez utiliser lapply avec rbind.fill (également avec la permission de Hadley), mais pourquoi la peine quand plyr il le fait automatiquement pour vous?]:

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top