2017-04-19 153 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