在 r 中提取 pubmed 摘要检索多行中的每个摘要(摘要中的行比 pubmed ID 中的行多)

Extracting pubmed abstracts in r retrieves each abstract in multiple rows (more rows in abstracts that in pubmed ID)

我正在尝试提取已发表的摘要及其标题,以将它们放入数据框中。 在成员Whosebug的帮助下,我能够编写下面的代码,这是可行的。现在的问题是 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)

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

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

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