我希望将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循环迭代条目。对于我拥有的案件数量来说,后者太慢了。非常感谢任何帮助。
答案 0 :(得分:2)
XML有太多级别让xmlToDataFrame
运行良好,所以我会创建一个将多个标签组合成一个分隔列表的函数(并为缺少的节点添加NA)
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