Как преобразовать данные XML в data.frame?
Вопрос
Я пытаюсь выучить R XML
упаковка.Я пытаюсь создать data.frame из образца XML-файла данных book.xml.Вот что я получаю:
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 не приближает меня даже близко к моему замыслу.Как следует двигаться к правильно сформированному фрейму данных?
Решение
Обычно я бы предложил попробовать xmlToDataFrame()
функция, но я считаю, что на самом деле это будет довольно сложно, поскольку изначально она не очень хорошо структурирована.
Я бы рекомендовал работать с этой функцией:
xmlToList(books)
Одна из проблем заключается в том, что у каждой книги есть несколько авторов, поэтому вам нужно будет решить, как с этим справиться, когда вы структурируете свой фрейм данных.
После того, как вы решили, что делать с проблемой нескольких авторов, довольно просто превратить список книг в фрейм данных с помощью ldply()
функцию в plyr (или просто используйте 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 не может с этим справиться должным образом.[В противном случае вы можете использовать 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>