Как искать в PubMed или других базах данных, используя R

Я недавно использовал отличный rplos пакет, который облегчает поиск по статьям, размещенным в API публичной библиотеки науки (PLOS). Я наткнулся на загвоздку в том, что в самом API, похоже, есть некоторая недостающая информация, главная из которых заключается в том, что по крайней мере в 2012 году есть статьи по API, для которых нет информации в поле "журнал". У меня есть DOI каждого документа, поэтому просто зайти в DOI и показать, что это настоящие статьи, опубликованные в реальных журналах, обычно PLOS ONE. Очевидно, было бы глупо сделать это 2000 раз.

Мне было интересно, если кто-нибудь знает, как найти исходный журнал, если у меня есть список DOI? Я посмотрел на пакет RISmed, который, по-видимому, может искать PubMed изнутри R, но я не мог понять, как заставить его давать полезную информацию (только количество поисковых запросов и некоторые идентификаторы PubMed, которые, вероятно, приводят к нужной мне информации),

Кто-нибудь знает, как превратить список DOI в исходные имена журналов?

РЕДАКТИРОВАТЬ: я просто подумал о другом простом решении. DOI содержат аббревиатуру названия журнала, и для такого случая, когда существует всего несколько журналов, можно просто использовать регулярные выражения, чтобы прочитать DOI и выбрать, из какого они журнала. Пример: 10.1371/ журнал.pone.0046711 от PLOS ONE.

3 ответа

Вот ответ, основанный на предложении Томаса попробовать rpubmed. Он начинается со списка проблемных DOI, находит соответствующие идентификаторы PubMed ID с помощью функции EUtilsSummary в RISmed, а затем получает связанные с ними данные журнала, используя код, измененный из Github для rpubmed и воспроизведенный ниже. Извините за редактирование кода rpubmed, но объекты в строке 44, кажется, не определены или не важны, поэтому я удалил их.

library(RCurl); library(XML); library(RISmed); library(multicore)

# dummy list of 5 DOIs. I actually have 2012, hence all the multicoring below
dois <- c("10.1371/journal.pone.0046711", "10.1371/journal.pone.0046681", "10.1371/journal.pone.0046643", "10.1371/journal.pone.0041465", "10.1371/journal.pone.0044562")

# Get the PubMed IDs
res <- mclapply(1:length(dois), function(x) EUtilsSummary(dois[x]))
ids<-sapply(res,QueryId)


######## rpubmed functions from https://github.com/rOpenHealth/rpubmed/blob/master/R/rpubmed_fetch.R
fetch_in_chunks <- function(ids, chunk_size = 500, delay = 0, ...){
  Sys.sleep(delay * 3600) # Wait for appropriate time for the server.
  chunks <- chunker(ids, chunk_size)
  Reduce(append, lapply(chunks, function(x) pubmed_fetch(x, ...)))
}

pubmed_fetch <- function(ids, file_format = "xml", as_r_object = TRUE, ...){

  args <- c(id = paste(ids, collapse = ","), db = "pubmed", rettype = file_format, ...)

  url_args <- paste(paste(names(args), args, sep="="), collapse = "&")
  base_url <- "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?retmode=full"
  url_string <- paste(base_url, url_args, sep = "&")
  records <- getURL(url_string)
  #NCBI limits requests to three per second
  Sys.sleep(0.33)
  if(as_r_object){
    return(xmlToList(xmlTreeParse(records, useInternalNodes = TRUE)))
  } else return(records)
}

chunker <- function(v, chunk_size){
  split(v, ceiling(seq_along(v)/chunk_size))
}
###### End of rpubmed functions

d<-fetch_in_chunks(ids)
j<-character(0)
for(i in 1:2012) j[i]<-as.character(d[[i]][[1]][[5]][[1]][[3]]) # the tortuous path to the journal name

Это создатель rplos...

Проверьте набор данных, который поставляется с пакетом plosfields который дает вам поля, которые можно искать, и вернуть

library(rplos)
head(plosfields)

            field                     description                           note
1              id DOI (Digital Object Identifier) Extended for partial documents
2      everything         All text in the article      Includes Meta information
3           title                   Article Title                        no note
4   title_display                   Article Title      For display purposes only
5 alternate_title               Alternative Title                        no note
6          author                          Author       Can have multiple values

Два поля, представляющие интерес для названия журнала: journal а также cross_published_journal_key, Например,

searchplos('science', 'id,publication_date,cross_published_journal_key,journal', limit = 2)

                            id cross_published_journal_key      journal     publication_date
1 10.1371/journal.pbio.0020122                 PLoSBiology PLoS Biology 2004-04-13T00:00:00Z
2 10.1371/journal.pbio.1001166                 PLoSBiology PLoS Biology 2011-10-04T00:00:00Z

Делает ли это то, что вы хотите?

С точки зрения получения дополнительной информации от DOI rmetadata находится в разработке, но может быть полезным. Также мы работаем над пакетом для Crossref, rcrossref, ( https://github.com/ropensci/rcrossref) - но похоже, что вышеизложенное делает то, что вы хотите, получая название журнала.

Вот мое решение, которое можно использовать в цикле for или других подходах для извлечения заголовков из DOI:

library(RISmed)
data(myeloma)
ArticleId(myeloma)
res <- EUtilsSummary(ArticleId(myeloma)[10])
fetch <- EUtilsGet(res, type = "efetch", db = "pubmed")
fetch@Title

Надеюсь, поможет!

Другие вопросы по тегам