0

ジャーナル記事レコードの XML ファイルをダウンロードし、R でさらに調査するためのデータセットを作成しようとしています。XML はまったく初めてで、R の初心者です 。GoogleScholarXScraperpubMed からのレコードの抽出

library(RCurl)
library(XML)
library(stringr)

#Search terms
SearchString<-"cancer+small+cell+non+lung+survival+plastic"
mySearch<-str_c("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=",SearchString,"&usehistory=y",sep="",collapse=NULL)

#Seach
pub.esearch<-getURL(mySearch)

#Extract QueryKey and WebEnv
pub.esearch<-xmlTreeParse(pub.esearch,asText=TRUE)
key<-as.numeric(xmlValue(pub.esearch[["doc"]][["eSearchResult"]][["QueryKey"]]))
env<-xmlValue(pub.esearch[["doc"]][["eSearchResult"]][["WebEnv"]])

#Fetch Records
myFetch<-str_c("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&WebEnv=",env,"&retmode=xml&query_key=",key)
pub.efetch<-getURL(myFetch)
myxml<-xmlTreeParse(pub.efetch,asText=TRUE,useInternalNodes=TRUE)

#Create dataset of article characteristics #This doesn't work
pub.data<-NULL
pub.data<-data.frame(
  journal <- xpathSApply(myxml,"//PubmedArticle/MedlineCitation/MedlineJournalInfo/MedlineTA", xmlValue),
  abstract<- xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Abstract/AbstractText",xmlValue),
  affiliation<-xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Affiliation", xmlValue),
  year<-xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Journal/JournalIssue/PubDate/Year", xmlValue)
  ,stringsAsFactors=FALSE)

私が抱えていると思われる主な問題は、返された XML ファイルが完全に均一に構造化されていないことです。たとえば、一部の参照には次のようなノード構造があります。

- <Abstract>
<AbstractText>The Wilms' tumor gene... </AbstractText>

いくつかはラベルを持っていて、このようなものです

- <Abstract>
<AbstractText Label="BACKGROUND &#38; AIMS" NlmCategory="OBJECTIVE">Some background text.</AbstractText>
<AbstractText Label="METHODS" NlmCategory="METHODS"> Some text on methods.</AbstractText>

「AbstactText」を抽出すると、24 行のデータが返されることを期待しています (今日、この作成された検索を実行すると 24 レコードがあります)、xpathSApply は「AbstactText」内のすべてのラベルをデータフレームの個々の要素として返します。このインスタンスで XML 構造を折りたたむ/ラベルを無視する方法はありますか? パスの最後に何も見つからない場合に xpathSApply が「NA」を返すようにする方法はありますか? 私は xmlToDataFrame を認識していますが、これは法案に適合するように思えますが、これを使用しようとするたびに、賢明なことは何も得られないようです。

ご協力いただきありがとうございます

4

1 に答える 1

1

ただし、どちらが必要かはわかりません。

xpathSApply(myxml,"//*/AbstractText[@Label]")

ラベル付きのノードを取得します(すべての属性などを保持します)。

xpathSApply(myxml,"//*/AbstractText[not(@Label)]",xmlValue)

ラベルのないノードを取得します。

編集:

test<-xpathApply(myxml,"//*/Abstract",xmlValue)

> length(test)
[1] 24

あなたが望むものをあなたに与えるかもしれません

編集:

NAで埋められた所属、年などを取得する

dumfun<-function(x,xstr){
res<-xpathSApply(x,xstr,xmlValue)
if(length(res)==0){
out<-NA
}else{
out<-res
}
out
}

xpathSApply(myxml,"//*/Article",dumfun,xstr='./Affiliation')
xpathSApply(myxml,"//*/Article",dumfun,xstr='./Journal/JournalIssue/PubDate/Year')
于 2012-07-25T17:58:51.357 に答える