【问题标题】:How to extract elements of a list in R?如何在R中提取列表的元素?
【发布时间】:2019-05-28 14:58:55
【问题描述】:

我有一个包含几个向量的列表,如下所示:

$`56`
[1] "OTU2998"             "UniRef90_A0A1Z9FS94" "UniRef90_A0A257ESC3"
[4] "UniRef90_A0A293NAV3" "UniRef90_A0A2E1NMU8" "UniRef90_A0A2E1NPX9"
[7] "UniRef90_A0A2E1NQL1" "UniRef90_A0A2E1NRD2" "UniRef90_X0UC66"    

$`57`
[1] "OTU3820"             "UniRef90_A0A1Z9H3N2" "UniRef90_A0A2D5I161"
[4] "UniRef90_A0A2E6PRN5"

$`58`
[1] "OTU4452"                "UniRef90_A0A1Z9KBI8"    "UniRef90_A0A2E1VTI6"   
[4] "UniRef90_A0A2G2KCN6"    "UniRef90_UPI000BFEC744"

$`59`
[1] "OTU0245"             "UniRef90_A0A1Z9MPM9" "UniRef90_A0A2E2ME98"
[4] "UniRef90_A0A2E8X9N7"

有没有办法只提取“OTUXXX”信息?我的意思是,我想得到这样的东西:

$`56`
[1] "OTU2998"       

$`57`
[1] "OTU3820"  

$`58`
[1] "OTU4452"   

$`59`
[1] "OTU0245" 

【问题讨论】:

    标签: r list


    【解决方案1】:

    我们可以遍历list并提取与字符串开头(^)后跟四位数字(\\d{4})直到结尾($)的子字符串'OTU'匹配的元素grepl 的字符串

    lapply(lst1, function(x) x[grepl("^OTU\\d{4}$", x)])
    #$`56`
    #[1] "OTU2998"
    
    #$`57`
    #[1] "OTU3820"
    
    #$`58`
    #[1] "OTU4452"
    
    #$`59`
    #[1] "OTU0245" "OTU1234"
    

    注意:仅使用 base R 方法


    如果我们是 tidyverse 爱好者,请使用 keep

    library(tidyverse)
    map(lst1, keep, str_detect, '^OTU\\d{4}$')
    

    数据

    lst1 <-  list(
      `56` = c("OTU2998", "UniRef90_A0A1Z9FS94", "UniRef90_A0A257ESC3", "UniRef90_A0A293NAV3", "UniRef90_A0A2E1NMU8", "UniRef90_A0A2E1NPX9", "UniRef90_A0A2E1NQL1", "UniRef90_A0A2E1NRD2", "UniRef90_X0UC66"),
      `57` = c("OTU3820", "UniRef90_A0A1Z9H3N2", "UniRef90_A0A2D5I161", "UniRef90_A0A2E6PRN5"),
      `58` = c("OTU4452", "UniRef90_A0A1Z9KBI8", "UniRef90_A0A2E1VTI6", "UniRef90_A0A2G2KCN6", "UniRef90_UPI000BFEC744"),
      `59` = c("OTU0245", "UniRef90_A0A1Z9MPM9", "UniRef90_A0A2E2ME98", "UniRef90_A0A2E8X9N7", "OTU1234")
    )
    

    【讨论】:

    • 实际上,向量中可能有不止一个“OTUXXX”,它们可以在向量中随机定位
    【解决方案2】:

    我喜欢 purrr::map 系列函数,因为它们易于传递函数和参数。提取这些元素的两个快速选项是使用 grep 使用 value = T 返回匹配的字符串,而不仅仅是它们的索引,或者使用 stringr::str_subset 执行相同的操作。

    此处的正则表达式匹配以“OTU”开头的字符串,后跟 1 个或多个数字。

    这两种方法一次可扩展多个匹配项:我在最后一个列表元素中添加了一个项目“OTU1234”来说明这一点。

    dl <- list(
      `56` = c("OTU2998", "UniRef90_A0A1Z9FS94", "UniRef90_A0A257ESC3", "UniRef90_A0A293NAV3", "UniRef90_A0A2E1NMU8", "UniRef90_A0A2E1NPX9", "UniRef90_A0A2E1NQL1", "UniRef90_A0A2E1NRD2", "UniRef90_X0UC66"),
      `57` = c("OTU3820", "UniRef90_A0A1Z9H3N2", "UniRef90_A0A2D5I161", "UniRef90_A0A2E6PRN5"),
      `58` = c("OTU4452", "UniRef90_A0A1Z9KBI8", "UniRef90_A0A2E1VTI6", "UniRef90_A0A2G2KCN6", "UniRef90_UPI000BFEC744"),
      `59` = c("OTU0245", "UniRef90_A0A1Z9MPM9", "UniRef90_A0A2E2ME98", "UniRef90_A0A2E8X9N7", "OTU1234")
    )
    
    purrr::map(dl, ~grep("^OTU\\d+$", ., value = T))
    #> $`56`
    #> [1] "OTU2998"
    #> 
    #> $`57`
    #> [1] "OTU3820"
    #> 
    #> $`58`
    #> [1] "OTU4452"
    #> 
    #> $`59`
    #> [1] "OTU0245" "OTU1234"
    purrr::map(dl, stringr::str_subset, "^OTU\\d+$")
    # same output as above
    

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多