2017-04-19 2 views
1

Endnote의 xml 출력을 각 자식 노드가 별도의 열인 R 데이터 프레임으로 변환하려고합니다.endnote XML을 R 데이터 프레임으로 변환

비슷한 질문이 이전에 here으로 요청되었지만 답변으로 인해 여러 작성자, 키워드 등이있는 레코드 문제가 해결되지 않았습니다 (문제가 언급 되었음에도 불구하고).

저는 여러 값을 자주 반환하는 제공자, 정기 간행물, 키워드와 같은 필드에 구분 기호 (예 :;)를 어떻게 포함 시킬지 궁금합니다.

예제 데이터는 다음과 같습니다. 알 수 있듯이 위에서 언급 한 필드에 대한 항목에는 구분 기호없이 추가 된 여러 항목이 있습니다.

library(XML) 
library(RCurl) 

urldata<-"https://gist.githubusercontent.com/nickbond/4f5a600836bf43a60d99e2a63e5a62de/raw/2088f8065eebbfe9e57c761ffa801b0a18588498/endnote.xml" 
endnotexml<-xmlParse(getURL(urldata)) 
xmlToDataFrame(getNodeSet(endnotexml,'//*/record')) 

나는 처음으로 목록으로 변환하려고 시도하는 것을 포함하여 for 루프를 통해 항목을 반복하는 것을 포함하여 다양한 접근법을 시도했다. 나중의 경우는 내가 가진 경우의 수가 너무 느리다. 어떤 도움이라도 대단히 감사하게 생각합니다.

답변

2

는 XML

x <- getNodeSet(endnotexml,'//record') 

xpath2 <-function(x, ...){ 
    y <- xpathSApply(x, ...) 
    y <- gsub(",", "", y) # remove commas if using comma separator 
    ifelse(length(y) == 0, NA, paste(y, collapse=", ")) 
} 

를 사용하여 최고의 .xmlToDataFrame가 잘 작동하는, 그래서는 구분 된 목록으로 여러 개의 태그를 결합 함수를 작성 (도없는 노드의 NA를 추가) 할 너무 많은 수준이 있습니다 따라서 xpath는 해당 노드와 관련이 있으며 필요한 열을 가져옵니다. 참고 xmlGetAttr도 사용할 수 있습니다.

res <- data.frame(
    authors = sapply(x, xpath2, ".//author", xmlValue), 
    year = sapply(x, xpath2, ".//dates/year", xmlValue), 
    journal = sapply(x, xpath2, ".//periodical/full-title", xmlValue), 
ref_type = sapply(x, xpath2, ".//ref-type", xmlGetAttr, "name") 
) 

res 
             authors year    journal  ref_type 
1      Abbott I., Le Maitre D. 2010  Austral Ecology Journal Article 
2   Abbott S., Chadwick D., Street G. 2007 Exploration Geophysics Journal Article 
3 Abdel-Fattah Z. A., Kora M. A., Ayyad S. N. 2013     Facies Journal article 
+0

감사합니다. Chris. 이는 설명한대로 작동하며 필요에 따라 추가 노드/열을 추가하는 것은 쉬운 프로세스입니다. 많은 감사합니다 !! – nickb

관련 문제