Разбор XML PubMed с использованием entrez_fetch в rentrez

Я собираю информацию об авторе и информацию о статье для поискового запроса в PubMed. Я успешно получаю имя автора, год публикации и другую информацию, используя entrez_fetch в пакете 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"]])})

Несмотря на то, что я получил всю необходимую информацию, у меня возникла проблема с выяснением того, какие авторы предназначены для какого 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_fetch в пакете rentrez.

Эта проблема действительно беспокоит меня, и я был бы очень признателен за любую помощь или руководство. Спасибо за ваши усилия и помощь заранее.


person Santosh M.    schedule 24.02.2017    source источник


Ответы (1)


На самом деле это вопрос о xpath (язык, используемый для указания этих узлов в файле XML), в котором я не претендую на звание эксперта. Но я думаю, что могу помочь в этом случае.

Вы хотите убедиться, что извлекаете информацию только для одной опубликованной записи (PubmedArticle запись) за раз. Вы можете написать функцию, которая делает это для одной записи

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 в каждой строке. Теперь мы можем распространить это на всю статью, вызывая эту функцию для каждой статьи.

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, но отвечу на любые вопросы о rentrez, зарегистрированные как проблемы, в репозитории github (для этого им не обязательно быть "жуками").

person david w    schedule 26.02.2017