2017-02-24 19 views
1

PubMedで検索用語の著者情報と記事情報を収集しています。私はをrentrezパッケージに使用して、著者名、出版年などの情報を正常に取得しています。以下の私のサンプルコードです:PubMed XMLを使用して、rentrezのentrez_fetchを使用して構文解析を行います。

library(rentrez) 
library(XML) 

pubmedSearch <- entrez_search("pubmed", term = "flexible ureteroscope", retmax = 100) 
SearchResults <- entrez_fetch(db="pubmed", pubmedSearch$ids, rettype="xml", parsed=TRUE) 
First_Name <- xpathSApply(SearchResults, "//Author", function(x) {xmlValue(x[["ForeName"]])}) 
Last_Name <- xpathSApply(SearchResults, "//Author", function(x) {xmlValue(x[["LastName"]])}) 
PubYear <- xpathSApply(SearchResults, "//PubDate", function(x) {xmlValue(x[["Year"]])}) 
PMID <- xpathSApply(SearchResults, "//ArticleIdList", function(x) {xmlValue(x[["ArticleId"]])}) 

私は必要なすべての情報を取得するにもかかわらず、私はどのPMIDためである著者考え出すに問題を抱えています。 PMIDごとに著者の長さが異なるためです。たとえば、自分のコードのように100個の記事の著者情報を解析した場合、著者名は100人を超え、それぞれのPMIDに関連付けることはできません。全体的に、私はこのような出力データ・フレームがしたい:

PMID  First_Name Last_Name   PubYear 
28221147 Carlos  Torrecilla Ortiz 2017 
28221147 Sergi  Colom Feixas  2017 
28208536 Dean G  Assimos    2017 
28203551 Chad M  Gridley    2017 
28203551 Bodo E  Knudsen    2017 

ので、この方法を、私は著者がさらなる分析のために有用たPMIDおよびそれに関連付けられているかを知るでしょう。

これは私のコードの小さな例です。私は、XMLの解析を使用してentrez_fetchrentrezパッケージの情報を収集しています。

この問題は、本当に私を悩ませていると私は本当に任意のヘルプや指導をいただければ幸いです。あなたの努力に感謝し、事前に助けてください。

答えて

2

これは本当に私は専門家であると主張していないのxpathについての質問(XMLファイルにそれらのノードを指定するために使用される言語)、です。しかし、私はこのケースで私が助けることができると思う。

あなたが一度に一つのPubMedのレコード(PubmedArticleエントリ)のための情報を抽出していることを確認します。あなたは、1つのレコードの

parse_paper <- function(paper){ 
    last_names <- xpathSApply(paper, ".//Author/LastName", xmlValue) 
    first_names <- xpathSApply(paper, ".//Author/ForeName", xmlValue) 
    pmid <- xpathSApply(paper, ".//ArticleId[@IdType='pubmed']", xmlValue) 
    data.frame(pmid=pmid, last_names=last_names, first_names=first_names) 
} 

各行に同じPMIDで、あなたの著者ごとに1行を与えるべきであるとことを行う関数を書くことができます。各記事でその関数を呼び出すことで、記事全体に拡張することができます。

parse_multiple_papers <- function(papers){ 
    res <- xpathApply(papers, "/PubmedArticleSet/*", parse_paper) 
    do.call(rbind.data.frame, res) 
} 

head(parse_multiple_papers(SearchResults)) 

 pmid  last_names first_names 
1 28221147 Torrecilla Ortiz  Carlos 
2 28221147  Colom Feixas  Sergi 
3 28208536   Assimos  Dean G 
4 28203551   Gridley  Chad M 
5 28203551   Knudsen  Bodo E 
6 28101159    Li Zhi-Gang 

ところで、私は通常のStackOverflowを検索しませんが、github repoで問題として提起しrentrez(彼らはそこに行くために「バグ」である必要はない)についてのご質問にお答えします。

関連する問題