在 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 数据中提取列表。然后我们可以使用 purrr
的 map*()
命令来展平数据。
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
我正在尝试提取已发表的摘要及其标题,以将它们放入数据框中。 在成员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 数据中提取列表。然后我们可以使用 purrr
的 map*()
命令来展平数据。
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