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

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

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

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

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


person lukeholman    schedule 08.03.2014    source источник
comment
Существует rpubmed, но вас также может заинтересовать rmetadata.   -  person Thomas    schedule 08.03.2014
comment
Большое спасибо! Я написал ответ, используя rpubmed. Вероятно, не самый простой способ, но, похоже, работает.   -  person lukeholman    schedule 09.03.2014


Ответы (3)


Вот ответ, основанный на предложении Томаса попробовать rpubmed. Он начинается со списка проблемных DOI, находит соответствующие номера идентификаторов PubMed с помощью функции 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
person lukeholman    schedule 09.03.2014

это создатель рплоса...

Ознакомьтесь с набором данных, который поставляется с пакетом 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) - но похоже, что приведенное выше делает то, что вы хотите проще, получая имя журнала.

person sckott    schedule 08.03.2014
comment
Большое спасибо, Скотт! Проблема, однако, в том, что не все записи API фактически имеют список для журнала. Попробуйте это: searchplos(10.1371/journal.pone.0046711, fields=id,publication_date,cross_published_journal_key,journal, toquery=doc_type:full, returndf = FALSE) В этой записи нет списка для журнала, хотя он есть для cross_published_journal_key. Я предполагаю, что в API есть несколько ошибок. Другая распространенная ошибка заключается в том, что они неправильно пишут название журнала, например. ПЛОС Медицина; есть также три разных формы капитализации PLoS ONE. - person lukeholman; 09.03.2014
comment
Вкратце: я обязательно попрошу функцию вернуть как cross_published_journal_key, так и журнал в будущем! К сожалению, при переборе всего PLoS требуется еще день на повторный поиск. - person lukeholman; 09.03.2014
comment
Я думаю, вы сможете выполнять массовые загрузки данных PLOS. могу спросить если интересно - person sckott; 09.03.2014
comment
Верно, я понимаю, что вы имеете в виду, говоря об отсутствующих названиях журналов. Это проблема, которую необходимо решить в отношении PLOS. Я могу спросить и посмотреть, могут ли они это исправить - person sckott; 09.03.2014
comment
Это здорово, если бы вы могли заставить их расставить точки над их (в основном превосходным) API. Возможно, вы правы насчет массовой загрузки документов по PLOS. Конечно, можно очень легко загрузить все документы BMC со своего FTP, но мне не повезло научиться извлекать части XML-файлов (например, заголовок, DOI, раздел методов и т. д.). Синтаксис rplos для этого намного проще. - person lukeholman; 09.03.2014
comment
Только что обнаружил, что вы можете использовать поле eissn, см. здесь groups.google.com/forum/#!topic/plos-api-developers/Pefx-hMALgI и пример вызова api.plos.org/search/?q=10.1371/ — вы, вероятно, можете gsub эти eissn с названием журнала — мы могли бы добавить это и внутри rplos - person sckott; 09.03.2014

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

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

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

person paoloeusebi    schedule 30.10.2018