2017-02-24 2 views
1

Je collecte des informations sur l'auteur et des informations sur l'article pour un terme de recherche dans PubMed. Je reçois le nom de l'auteur, l'année de publication et d'autres informations avec succès en utilisant entrez_fetch dans le paquet rentrez. À la suite de mon code exemple:Analyse XML PubMed en utilisant entrer_fetch dans rentrez

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"]])}) 

Malgré obtenir toutes les informations dont je avais besoin, j'ai un problème à déterminer quels auteurs sont pour lesquels PMID. C'est parce que la longueur des auteurs est différente pour chaque PMID. Par exemple, si j'ai analysé les informations sur les auteurs pour 100 articles comme dans mon code, j'obtiens plus de 100 noms d'auteurs et je ne peux pas les associer aux PMID respectifs. Dans l'ensemble, je voudrais avoir une trame de données de sortie comme ceci:

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 

donc de cette façon, je ne sais quels sont les auteurs sont associés à qui PMID et utile pour une analyse ultérieure. Juste pour la note, ceci est un petit exemple de mon code. Je collecte plus d'informations en utilisant XML l'analyse via entrez_fetch dans le paquet rentrez.

Ce problème m'inquiète vraiment et j'apprécierais vraiment n'importe quelle aide ou direction. Merci pour vos efforts et votre aide à l'avance.

Répondre

2

C'est vraiment une question à propos de xpath (la langue utilisée pour spécifier ces nœuds dans un fichier XML), sur laquelle je ne prétends pas être un expert. Mais je pense que je peux aider dans ce cas.

Vous voulez vous assurer que vous extrayez des informations pour un enregistrement public (entrée PubmedArticle) à la fois. Vous pouvez écrire une fonction qui fait que pour un enregistrement

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) 
} 

Cela devrait vous donner une ligne par l'auteur, avec le même pmid dans chaque ligne. Nous pouvons maintenant étendre cela à l'ensemble de l'article en appelant cette fonction sur chaque article.

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 

BTW, je ne cherche généralement pas stackoverflow, mais répondra à toutes vos questions sur rentrez déposée questions au github repo (ils ne doivent pas être « bugs » pour aller là-bas).