Как искать в 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
Надеюсь, поможет!