【问题标题】:Extracting affiliation information from PubMed search string in R从 R 中的 PubMed 搜索字符串中提取隶属关系信息
【发布时间】:2021-01-15 19:07:02
【问题描述】:

我需要一些帮助来从 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 搜索字符串很长,因此我没有在此处包含它。因此,主要目的是从这个搜索字符串中生成一个数据框,该字符串是一个表格,清楚地显示了 PubMed 文章中的隶属关系和其他一般信息。

任何帮助将不胜感激!

【问题讨论】:

    标签: html r xml dataframe pubmed


    【解决方案1】:

    您尝试过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 &lt;- 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。确保将 &amp;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))
    

    【讨论】:

    • 您好,感谢您的快速回复!我只是尝试了您的建议,但由于某种原因,它根本没有选择我的搜索字符串。我不确定它是否太长,所以我将继续调整代码/搜索字符串。我的查询也是多个“OR”而不是“AND”,搜索字符串中的内容可能太多?再次感谢!
    • 你可以在这里发布你的搜索字符串吗?
    • 嗨,我已经能够从搜索字符串中导出 PMID,而不是作为解决此问题的替代方法。大约有 10,000 个 PMID,但前几个是 30361262 31203996 31141631 31028669 30420752 29601269 31628431 27959731 30499168 如果这有帮助的话!我一直在尝试这样做,因为它似乎类似于网上看到的 PubMed R 示例。
    • 那么你的最终目标是什么?您想要一个数据框,其中一列带有 pmid,另一列带有作者单位?
    • 是的,我之前创建了一个数据框:PMID:作者姓名:中心:国家:州我想复制类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多