您尝试过pubmedR 包吗? https://cran.rstudio.com/web/packages/pubmedR/index.html
library(pubmedR)
library(purrr)
library(tidyr)
my_query <- '(((("diabetes mellitus"[MeSH Major Topic]) AND ("english"[Language])) AND (("2020/01/01"[Date - Create] : "3000"[Date - Create]))) AND ("coronavirus"[MeSH Major Topic])'
my_request <- pmApiRequest(query = my_query,
limit = 5)
您可以使用内置函数my_pm_df <- pmApi2df(my_request),但这不会为所有作者提供从属关系。
您可以使用purrr 中的pluck() 和map() 的组合将您需要的内容提取到小标题中。
auth <- pluck(my_request, "data") %>% {
tibble(
pmid = map_chr(., pluck, "MedlineCitation", "PMID", "text"),
author_list = map(., pluck, "MedlineCitation", "Article", "AuthorList")
)
}
所有作者数据都包含在该嵌套列表中,在 Author$AffiliationInfo 列表中(注意它是一个列表,因为一个作者可以有多个隶属关系)。
================================================ ==
基于 cmets 编辑:
首先构建您的请求 URL。确保将 &email 替换为您的电子邮件地址:
library(httr)
library(xml2)
mypmids <- c("32946812", "32921748", "32921727", "32921708", "32911500",
"32894970", "32883566", "32880294", "32873658", "32856805",
"32856803", "32820143", "32810084", "32809963", "32798472")
my_query <- paste0("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=",
mypmids,
"&retmode=xml&email=MYEMAIL@MYDOMAIN.COM")
我喜欢将我的 API 请求封装在 safely 中以捕获任何错误。然后使用map 循环遍历my_query 向量。请注意,我们在每次请求后Sys.sleep 5 秒以遵守 PubMed 的速率限制。您可能可以将其缩短几秒钟甚至更短,请查看 API 文档。
get_safely <- safely(GET)
my_req <- map(my_query, function(z) {
print(z)
req <- get_safely(url = z)
Sys.sleep(5)
return(req)
})
接下来我们在read_xml() 中解析带有content() 的请求。请注意,我们正在解析 result:
my_resp <- map(my_req, function(z) {
read_xml(content(z$result,
as = "text",
encoding = "UTF-8"))
})
这可能可以清理一些,但它有效。将 AuthorInfo 强制为列表并使用 map() 、 pluck() 和 unnest() 的组合。请注意,给定的作者可能有多个从属关系,但我只选择第一个。
my_pm_list <- map(my_resp, function (z) {
my_xml <- xml_child(xml_child(z, 1), 1)
pmid <- xml_text(xml_find_first(my_xml, "//PMID"))
authinfo <- as_list(xml_find_all(my_xml, ".//AuthorList"))
return(list(pmid, authinfo))
})
myauthinfo <- map(my_pmids, function(z) {
auth <- z[[2]][[1]]
})
mytibble <- myauthinfo %>% {
tibble(
lastname = map_depth(., 2, pluck, "LastName", 1, .default = NA_character_),
firstname = map_depth(., 2, pluck, "ForeName", 1, .default = NA_character_),
affil = map_depth(., 2, pluck, "AffiliationInfo", "Affiliation", 1, .default = NA_character_)
)
}
my_unnested_tibble <- mytibble %>%
bind_cols(pmid = map_chr(my_pm_list, pluck, 1)) %>%
unnest(c(lastname, firstname, affil))