문제

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을 향해 어떻게 진행해야 합니까?

도움이 되었습니까?

해결책

일반적으로 다음을 시도하는 것이 좋습니다. xmlToDataFrame() 기능이 있지만 처음부터 잘 구성되어 있지 않기 때문에 실제로는 상당히 까다로울 것이라고 생각합니다.

이 기능을 사용하는 것이 좋습니다.

xmlToList(books)

한 가지 문제는 책당 여러 명의 저자가 있으므로 데이터 프레임을 구성할 때 이를 처리하는 방법을 결정해야 한다는 것입니다.

여러 저자 문제를 어떻게 처리할지 결정했다면 다음을 사용하여 도서 목록을 데이터 프레임으로 바꾸는 것이 매우 간단합니다. ldply() 함수를 plyr에서 사용하거나 lapply를 사용하고 do.call("rbind"...)을 사용하여 반환 값을 data.frame으로 변환합니다.

전체 예는 다음과 같습니다(작성자 제외).

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 (또한 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top