求助:用R的Rentrez包获取药物最早PubMed提及文献的方法
解决Rentrez获取药物最早Pubmed文献的问题
核心思路
NCBI Entrez API的pub_date排序仅支持降序(最新文献在前),无法直接升序检索。但可以通过两次搜索高效定位到最早的文献:
- 首次搜索仅获取总命中数,不返回具体ID;
- 第二次搜索直接定位到结果列表的最后一条(即最早的文献),仅获取该条的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
相关产品推荐
相关产品推荐

