用R提取PubMed XML数据:解决重复行与Mesh Terms混排问题
修复PubMed XML提取数据的重复与Mesh术语混淆问题
问题概述
使用R的rentrez包获取2条PubMed记录,尝试提取PMID、索引方法(IndexingMethod)、最后更新日期(DateRevised)及合并后的Mesh术语到DataFrame并导出CSV时,出现以下问题:
- 生成4行结果(应为2行),PMID重复
- 每行Mesh术语包含所有记录的术语,未按单条记录区分
错误原因
- 提取函数
extract_info中所有XPath查询均基于整个XML文档(testa_rec),而非传入的单条MedlineCitation节点,导致每次调用函数都会提取所有记录的信息,生成两行数据;再经过lapply遍历2个节点,最终合并为4行。 - Mesh术语的提取未限定在当前
MedlineCitation节点范围内,导致合并了所有记录的Mesh术语。
修复后的代码
library(xml2) library(XML) library(data.table) library(rentrez) library(dplyr) # 获取XML数据(2条测试文章) testa <- entrez_search(db="pubmed", term="38863400 OR 32029379", use_history=TRUE) testa_rec <- entrez_fetch(db="pubmed", id=testa$ids, rettype="xml", parsed=TRUE) # 提取单条记录信息的函数(修改为处理单个MedlineCitation节点) extract_info <- function(medline_node) { # 基于当前节点提取信息,使用相对XPath路径 indexing <- xmlGetAttr(medline_node, "IndexingMethod") date <- xmlValue(xpathSApply(medline_node, "./DateRevised", xmlRoot)[[1]]) pmid <- xmlValue(xpathSApply(medline_node, "./PMID", xmlRoot)[[1]]) # 提取当前节点下的所有Mesh术语并合并 mesh_terms <- xpathSApply(medline_node, "./MeshHeadingList/MeshHeading", xmlValue) mesh_str <- if(length(mesh_terms) > 0) paste(mesh_terms, collapse = ";") else NA # 返回单行tibble tibble( pmid = pmid, indexing = indexing, date = date, mesh = mesh_str ) } # 获取所有MedlineCitation节点 articles_nodes <- getNodeSet(testa_rec, "//MedlineCitation") # 对每个节点应用提取函数 results_list <- lapply(articles_nodes, extract_info) # 合并为单个DataFrame final_results <- bind_rows(results_list) # 导出为CSV fwrite(final_results, file ="myDT.csv")
关键修改说明
- 函数参数改为单个
MedlineCitation节点,所有XPath查询基于该节点使用相对路径(./开头),确保只提取当前记录的信息 - Mesh术语提取限定在当前节点的
MeshHeadingList/MeshHeading下,仅收集当前记录的术语 - 每个函数调用返回单行数据,避免重复生成多条记录
正确输出示例
pmid,indexing,date,mesh 38863400,Automated,20240615,"Humans;Ethiopiaepidemiology;Female;Adult;Adolescent;Obesityepidemiology;Middle Aged;Overweightepidemiology;Young Adult;Prevalence;Health Surveys;Socioeconomic Factors;Risk Factors;Age Factors" 32029379,Curated,20200306,"Abortion, Inducedmethodstrends;Female;Gestational Age;Humans;Pregnancy;Women's Health"
内容的提问来源于stack exchange,提问作者Hope Lappen
相关产品推荐
相关产品推荐

