从 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))
我需要一些帮助从 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))