2017-04-19 321 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-loop迭代條目。後者對於我的案件數量來說太慢了。任何援助非常感謝。

回答

2

的XML具有xmlToDataFrame工作得很好,所以我會創建一個合併多個標籤成分隔列表的功能(並添加NAS進行缺少的節點)

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=", ")) 
} 

運用領先的.級別太多所以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

非常感謝克里斯。這與所描述的一樣工作,並且根據需要添加額外的節點/列是一個簡單的過程。非常感謝!! – nickb