首页 > 解决方案 > 在 r 中提取 pubmed 摘要检索多行中的每个摘要(摘要中的行多于 pubmed ID 中的行)

问题描述

我正在尝试提取已发布的摘要及其标题以将它们放置在数据框中。在成员stackoverflow的帮助下,我能够编写下面的代码,它可以工作。现在的问题是 abstracts 变量中的行数高于 pmid 或 title 的行数,因此我无法正确合并它们。查看我拥有的 xml 文件的结构,摘要似乎有多个?节点,这就是为什么它们被提取到 > 一行。任何建议如何克服这一点并将每个摘要放在一行中,以便我可以合并变量。

这是我的代码:



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)

content(op)


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))


pmidd = as.data.frame(xpathSApply(a, '/PubmedArticleSet/PubmedArticle/MedlineCitation/PMID', xmlValue))

title = as.data.frame(xpathSApply(a, '/PubmedArticleSet/PubmedArticle/MedlineCitation/Article/ArticleTitle', xmlValue))

abstract = as.data.frame(xpathSApply(a, '/PubmedArticleSet/PubmedArticle/MedlineCitation/Article/Abstract/AbstractText', xmlValue))

nrow(pmidd)
nrow(abstract)

标签: rxmlpubmedpubmed-api

解决方案


有些文章的摘要分布在几个部分(目标、方法……),有些只有一个条目,有些则根本没有摘要。您必须处理所有这些不同的情况。

xml::xmlToList()可用于从 xml 数据中提取列表。然后我们可以使用purrr'smap*()命令来展平数据。

library(purrr)
b <- xmlToList(a)


res <- map_dfr(b, \(x) {
  abstract_l <- x$MedlineCitation$Article$Abstract
  if (is.null(abstract_l))
    abstract_l <- ""
  tibble(
    pmid = x$MedlineCitation$PMID$text,
    title = x$MedlineCitation$Article$ArticleTitle,
    abstract = ifelse(
      length(abstract_l) > 1,
      map_chr(abstract_l, \(y) y[[1]]) |> paste(collapse = "\n"),
      unlist(abstract_l)
    )
  )
})
res$abstract

推荐阅读