r - 在 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)
解决方案
有些文章的摘要分布在几个部分(目标、方法……),有些只有一个条目,有些则根本没有摘要。您必须处理所有这些不同的情况。
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
推荐阅读
- asp.net-core - 是否有使用 swagger.json 为 Flurl 自动生成的代码?
- python - Python中多级线性插值的高效方法
- firebase - Firebase 中的无崩溃用户指标
- python - 为什么我的 for 循环打印在每隔一行而不是每一行上?
- angular - 如何使用路由参数将 URL 发送到 Angular 项目?
- twilio - 如何使用 twilio 为聊天机器人创建上下文
- c# - 如何使 HttpClient.PostAsync 的工作方式与 Postman 的帖子相同?
- python - 检查目录是否存在,创建嵌套目录
- python - 每个元素的计数反转
- python - 如何为 MySQL WHERE 条件格式化日期时间