【问题标题】:How to search PubMed or other databases using R如何使用 R 搜索 PubMed 或其他数据库
【发布时间】:2018-10-30 23:10:51
【问题描述】:

我最近一直在使用出色的 rplos package,它可以非常轻松地搜索公共科学图书馆 (PLOS) API 上托管的论文。我遇到了一个障碍,因为 API 本身似乎缺少一些信息 - 一个主要问题是至少有 2012 篇关于 API 的论文在“期刊”字段中没有任何信息。我有每篇论文的 DOI,因此很容易通过 Google 搜索 DOI 并显示这些是发表在真实期刊上的真实论文,通常是 PLoS ONE。显然,这样做 2000 次是愚蠢的。

我想知道是否有人知道如何找到来源期刊,如果我有 DOI 列表?我查看了RISmed package,它显然可以从 R 中搜索 PubMed,但我无法弄清楚如何让它提供有用的信息(只是搜索命中的数量,以及一些可能导致我想要的信息的 PubMed ID )。

有人知道如何将 DOI 列表转换为来源期刊名称吗?

编辑:我只是想到了另一个简单的解决方案。 DOI 包含期刊名称的缩写,对于这种只有少数期刊的情况,可以使用正则表达式读取 DOI 并选择它们来自哪个期刊。示例:10.1371/journal.pone.0046711 来自 PLoS ONE。

【问题讨论】:

  • 有rpubmed,但您可能也对rmetadata 感兴趣。
  • 非常感谢!我已经使用 rpubmed 写了一个答案。可能不是最简单的方法,但似乎可行。

标签: r pubmed doi ropensci


【解决方案1】:

这是基于 Thomas 建议尝试 rpubmed 的答案。它从有问题的 DOI 列表开始,使用 RISmed 中的 EUtilsSummary 函数查找匹配的 PubMed ID 编号,然后使用从 Github for 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

【讨论】:

    【解决方案2】:

    这是 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) - 但似乎上面的内容更容易实现您想要的,获得期刊名称。

    【讨论】:

    • 非常感谢斯科特!然而,问题是并非所有 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 也有三种不同的大写形式。
    • 简而言之:我会确保我要求函数在将来返回 cross_published_journal_key 和 journal!不幸的是,搜索整个 PLoS 后,又需要一天时间才能再次搜索。
    • 我认为您可以批量下载 PLOS 数据。我可以问你有没有兴趣
    • 好吧,我明白你关于缺少期刊名称的意思了。这是 PLOS 方面需要解决的问题。我可以问问看他们能不能解决这个问题
    • 那太好了,如果你能让他们在他们的(大部分是优秀的)API 上加点 Is。关于大规模下载 PLOS 论文,您可能是对的。人们当然可以非常轻松地从他们的 FTP 下载所有 BMC 论文,但我没有运气学会提取部分 XML 文件(例如标题、DOI、方法部分等)。 rplos 语法对此要容易得多。
    【解决方案3】:

    这是我的解决方案,可用于 for 循环或其他方法从 DOI 中提取标题:

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2019-12-10
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多