从 R 中的 PubMed 搜索字符串中提取隶属关系信息

Extracting affiliation information from PubMed search string in R

我需要一些帮助从 R 中的 PubMed 搜索字符串中提取隶属关系信息。我已经成功地从单个 PubMed ID XML 中提取了隶属关系信息,但现在我需要一个包含多个术语的搜索字符串从中提取隶属信息,然后创建一个包含以下列的数据框:PMID、作者、国家、州等。

到目前为止,这是我的代码:

my_query <- (PubMed Search String)
my_entrez_id <- get_pubmed_ids(my_query)
my_abstracts_txt <- fetch_pubmed_data(my_entrez_id, format = "abstract")

PubMed 搜索字符串很长,因此我没有在此处包含它。因此,主要目的是根据该搜索字符串生成一个数据框,该字符串 table 清楚地显示 PubMed 文章中的隶属关系和其他一般信息。

如有任何帮助,我们将不胜感激!

你试过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 列表中(注意这是一个列表,因为一位作者可以有多个从属关系)。

============================================= ==== 根据评论进行编辑:

首先构建您的请求 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))