2017-04-19 14 views
1

Endnoteのxml出力をRデータフレームに変換し、各子ノードを別々の列に変換したいと考えています。endnote XMLをRデータフレームに変換する

同様の質問は以前にhereと尋ねられましたが、回答者は複数の著者やキーワードなどのレコードの問題を解決しませんでした(問題は記載されていましたが)。

寄稿者、定期刊行物、キーワード(複数の値を返すことが多い)などのフィールドにどのようにセパレータ(たとえば;

例のデータは以下のとおりです。見て分かるように、上記のフィールドのエントリは、セパレータを付けずに複数のエントリが追加されています。最初のリストに変換しようとすると、forループを介してエントリを反復を含む -

library(XML) 
library(RCurl) 

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

Iは、アプローチの範囲を試みました。後では、私が持っている事件の数があまりにも遅かった。どんな支援も非常に感謝しています。

答えて

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 
+0

ありがとうございました。これは説明したとおりに機能し、必要に応じて追加のノード/列を追加するのは簡単なプロセスです。どうもありがとう!! – nickb

関連する問題