2010-01-14 3 views
32

R의 XML 패키지를 배우려고합니다. books.xml 샘플 xml 데이터 파일에서 data.frame을 만들려고합니다. 의 내 의도에 나도 가까이하지 않는이 xpathSApply의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) 

각을 : 여기에 내가 무엇을 얻을. 잘 구성된 data.frame으로 어떻게 진행해야합니까?

답변

36

일반적으로 xmlToDataFrame() 함수를 사용하는 것이 좋지만 실제로 시작하기에 적절하지 않기 때문에 실제로는 상당히 까다로운 도구라고 생각합니다.

나는이 기능을 작동 추천 :

xmlToList(books) 

하나의 문제는 책에 여러 저자 있다는 것을, 그래서 당신은 당신이 당신의 데이터 프레임을 구조화 할 때 것을 처리하는 방법을 결정해야합니다.

여러 작성자 문제로 무엇을 할 지 결정한 후에는 책 목록을 plyr에 ldply() 함수가있는 데이터 프레임으로 변환하거나 (또는 ​​lapply를 사용하여 반환 값을 데이터로 변환하십시오. . ("rbind을"...) do.call 사용하여 .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가 제대로 처리 할 수 ​​없습니다. 그렇지 않으면 0을 사용할 수 있습니다. (또한 해들리의 제공) rbind.fill 만에 12,315,왜 귀찮게 할 때 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> 
+7

나 자신이 말하는 찾기 "? 그런데 왜 plyr가 자동으로 당신을 위해 그것을 수행 할 때 방해를"그 엄청 많이 . –

+0

질문 : 제 경우에는 코드에서 오류 "HTTP 리소스를로드하지 못했습니다. 오류 : 1 : HTTP 리소스를로드하지 못했습니다"가 발생합니다. 왜 그런가요? – user2006697

+2

@ user2006697 링크가 이동됩니다 : "http://www.w3schools.com/xsl/books.xml" – zyurnaidi