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

R提取PubMed摘要行数多于PMID无法合并问题求解

问题根因

你之前的代码直接全局匹配所有AbstractText节点,只要某篇文献包含多个结构化摘要节点(比如背景、方法、结论分节点的情况),就会被拆分为多行,自然会出现摘要行数高于PMID、标题行数的问题。

解决方案

核心逻辑是按单篇文献为单位提取字段:先定位到每篇文献的独立节点,再对单篇节点内的所有AbstractText内容做拼接,保证每篇文献仅返回1条合并后的摘要,三个字段天然对齐。

修改后的完整可运行代码
library(XML)
library(httr)
library(glue)
library(dplyr)

query = 'asthma[mesh]+AND+eosinophils[mesh]+AND+2009[pdat]'
reqq = glue ('https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&RetMax=50&term={query}')
op = GET(reqq)

df_op <- op %>% xml2::read_xml() %>% xml2::as_list()
pmids <- df_op$eSearchResult$IdList %>% unlist(use.names = FALSE)

reqq1 = glue("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={paste0(pmids, collapse = ',')}&rettype=abstract&retmode=xml")
op1 = GET(reqq1)
a = xmlParse(content(op1))

# --------------------修改部分开始--------------------
# 获取所有单篇文献的根节点
article_nodes <- getNodeSet(a, '/PubmedArticleSet/PubmedArticle/MedlineCitation')

# 逐篇提取三个字段并拼接摘要
result_list <- lapply(article_nodes, function(single_node){
  # 提取当前篇PMID
  pmid_val <- xpathSApply(single_node, './PMID', xmlValue)
  # 提取当前篇标题
  title_val <- xpathSApply(single_node, './Article/ArticleTitle', xmlValue)
  # 提取当前篇所有摘要片段,拼接为单个字符串,无摘要返回NA
  abstract_segs <- xpathSApply(single_node, './Article/Abstract/AbstractText', xmlValue)
  abstract_val <- ifelse(length(abstract_segs) > 0, paste(abstract_segs, collapse = " "), NA_character_)
  
  return(data.frame(
    pmid = pmid_val,
    title = title_val,
    abstract = abstract_val,
    stringsAsFactors = FALSE
  ))
})

# 合并为最终数据框
final_pubmed_df <- do.call(rbind, result_list)
# --------------------修改部分结束--------------------

# 校验行数
nrow(final_pubmed_df)
length(pmids)
方案说明
  • 所有字段从同一篇文献的根节点下提取,不会出现字段错配的问题
  • 用paste(..., collapse = " ")将同一篇文献的多个摘要片段合并为一行,不管有多少个AbstractText节点都只会返回1条结果
  • 兼容无摘要的文献,不会因节点缺失导致提取报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:00:00