【问题标题】:How to extract words from a list of the data frame list MESH from PubMed in R如何从 R 中 PubMed 的数据框列表 MESH 列表中提取单词
【发布时间】:2019-02-13 05:17:27
【问题描述】:

我一直在尝试从具有嵌套列表的数据框中提取数据,但在尝试使用字符串函数 (str_detect) 后,我只能处理变量 Abstract 这里是我的数据示例

{r setup, include=FALSE}
library(RISmed)
library(reticulate)
library(dplyr)
library(tibble)
library(stringr)
RCT_topic <- 'Randomized Clinical Trial'
RCT_query <- EUtilsSummary(RCT_topic, mindate=2005, maxdate=2015, retmax=2000)
summary(RCT_query)
RCT_records <- EUtilsGet(RCT_query)
RCT_data <- data_frame('PMID'=PMID(RCT_records),
                       'Title'=ArticleTitle(RCT_records),
                       'Abstract'=AbstractText(RCT_records),
                       'Year Published'=YearPubmed(RCT_records),
                       'Month Published'=MonthPubmed(RCT_records),
                       'Country'= Country(RCT_records),
                       'Grant' =GrantID(RCT_records),
                       'Acronym' =Acronym(RCT_records),
                       'Agency' =Agency(RCT_records),
                       'Mesh'=Mesh(RCT_records))
#Latino
RCT_data$Latino <- grepl("Latino|latino|Hispanic|hispanic",RCT_data$Abstract)
table(RCT_data$Latino)
RCT_true = RCT_data[RCT_data$Latino == "TRUE",]
RCT_true %>% str_detect("Hispanic Americans")
RCT_true %>% mutate(Latino_Mesh = ifelse(Mesh %>% str_detect("Latino|latino|Hispanic|hispanic"), "yes", "no"))

此代码将创建 R 已读取的 11 个观察值的子集,在变量 Abstract 中包含 latino 或 hispanic 这个词,我试图找到一种方法让 R 读取变量 Mesh 但它没有似乎能够阅读整个嵌套列表,即使当您看到每个变量时,您也可以清楚地看到列表中有西班牙裔美国人这个词

{r}
RCT_true$Mesh

我正在尝试找到一种方法,以便 R 可以读取 RCT_true$Mesh 并返回是的,在新列中有一个单词“西班牙裔美国人”,就像我之前使用抽象变量所做的那样

【问题讨论】:

    标签: r mesh stringr text-extraction


    【解决方案1】:

    由于 RCT_true$Mesh 是包含数据框的列表,因此应使用 grepl 函数评估每个数据框并将结果保存在索引器向量中(即RCT_true$Mesh_Latino):

    lapply(RCT_true$Mesh, function(x){
    
       any( grepl("(Latino|latino|Hispanic|hispanic)", as.character(x$Heading) ) )
    
      }) %>% 
      unlist() %>%
      as.logical() -> RCT_true$Mesh_Latino
    
    RCT_true[RCT_true$Mesh_Latino == "TRUE",]
    
    # # A tibble: 5 x 12
    #  PMID  Title Abstract `Year Published` `Month Publishe… Country Grant Acronym Agency Mesh  Latino Mesh_Latino
    #  <chr> <chr> <chr>               <dbl>            <dbl> <chr>   <chr> <chr>   <chr>  <lis> <lgl>  <lgl>      
    #1 2671… Beyo… "Within…             2015               12 United… CA01… CA      NCI N… <dat… TRUE   TRUE       
    #2 2670… Trea… OBJECTI…             2015               12 United… KL2 … TR      NCATS… <dat… TRUE   TRUE       
    #3 2669… Vali… "Resear…             2015               12 England NA    NA      NA     <dat… TRUE   TRUE       
    #4 2668… The … BACKGRO…             2015               12 United… K23 … MH      NIMH … <dat… TRUE   TRUE       
    #5 2665… Heal… BACKGRO…             2015               12 United… R01 … HL      NHLBI… <dat… TRUE   TRUE
    

    【讨论】:

    • 谢谢,一段时间以来我一直在努力解决这个问题,但是关于 'as.logical() -> RCT_true$Mesh_Latino' 如何与反转不同的快速学习问题并使用 'RCT_true$Mesh_Latino = as.logical()' 因为我之前没见过 ->
    • 当我尝试使用整个代码时 RCT_data 'lapply(RCT_data$Mesh, function(x){ any( grepl("(Latino|latino|Hispanic|hispanic)", as.character(x) $Heading) ) ) }) %>% unlist() %>% as.logical() -> RCT_data$Mesh_Latino RCT_data[RCT_data$Mesh_Latino == "TRUE",]' 我收到以下错误 x 中的错误$Heading : $ 运算符对原子向量无效
    • 这是由于列不存在,但这就是我跟随你的代码时得到的。上述答案背后的想法主要是处理每个列表并在更适合的地方应用 grepl 函数。在上述情况下,Heading 列是合适的
    • 那么我必须创建什么列?我已经尝试了各种解决方法,是的,它非常适合上面的示例,但是如果我要在 RCT_data 上执行此操作,我是否必须专门更改某些内容?我一直在重新创建一个新的 RCT_data$Latino 并使用 str_detect 和 mutate 部分但无济于事
    • 好吧,你可以把as.character(x$Heading)改成as.character( x[[1]] )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多