You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用R的Rentrez包获取药物最早PubMed提及文献的方法

解决Rentrez获取药物最早Pubmed文献的问题

核心思路

NCBI Entrez API的pub_date排序仅支持降序(最新文献在前),无法直接升序检索。但可以通过两次搜索高效定位到最早的文献:

  1. 首次搜索仅获取总命中数,不返回具体ID;
  2. 第二次搜索直接定位到结果列表的最后一条(即最早的文献),仅获取该条的ID。

实现代码

library(rentrez)

# 定义函数:获取单个药物的最早Pubmed文献ID及发表日期
get_oldest_pubmed_record <- function(drug_name) {
  # 第一步:获取总搜索结果数(不返回ID,节省资源)
  search_metadata <- entrez_search(
    db = "pubmed",
    term = paste0(drug_name, "[Title/Abstract]"),
    sort = "pub_date",
    retmax = 0
  )
  
  total_hits <- search_metadata$count
  
  if (total_hits == 0) {
    warning(paste("未找到", drug_name, "相关文献"))
    return(list(drug = drug_name, oldest_id = NA, pub_date = NA))
  }
  
  # 第二步:定位到最后一条结果(最早文献),仅获取该ID
  oldest_id_search <- entrez_search(
    db = "pubmed",
    term = paste0(drug_name, "[Title/Abstract]"),
    sort = "pub_date",
    retstart = total_hits - 1,
    retmax = 1
  )
  
  # 获取该文献的发表日期
  article_info <- entrez_summary(db = "pubmed", id = oldest_id_search$ids)
  pub_date <- article_info$pubdate
  
  return(list(
    drug = drug_name,
    oldest_id = oldest_id_search$ids,
    pub_date = pub_date
  ))
}

# 测试示例
aspirin_result <- get_oldest_pubmed_record("aspirin")
print(aspirin_result)

关键细节说明

  • retmax=0:仅返回搜索结果的元数据(总命中数),避免返回大量ID占用内存和API配额;
  • retstart=total_hits-1:因为Entrez的结果索引从0开始,总命中数减1就是最后一条结果的位置,配合retmax=1即可精准获取最早的文献ID;
  • 速率限制:批量处理多个药物时,建议添加config=httr::config(delay=1)参数到entrez_search中,避免触发NCBI API的限流机制;
  • 边界处理:针对无搜索结果的情况,添加了警告和NA返回,避免程序报错。

批量处理扩展

如果需要处理多个药物,可以用lapply批量调用函数:

drug_list <- c("aspirin", "metformin", "lisinopril")
all_results <- lapply(drug_list, get_oldest_pubmed_record)
# 转换为数据框方便查看
results_df <- do.call(rbind.data.frame, all_results)
print(results_df)

内容的提问来源于stack exchange,提问作者D Greenwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:09:59