【问题标题】:Extract elements from lfile into a list in R将lfile中的元素提取到R中的列表中
【发布时间】:2022-01-19 21:46:40
【问题描述】:

我有一个文件,例如:

>Nscaffold_033778.1_22 [24674 - 24880] some information  
ACCATTAAGAGAGAAAAGAGAGGAGAGAGAGAGAGGAGAGAGAGAGAGAGGagAGGAAGA
AGGAGAGAGA
>NC_0337652.1_23 [26291 - 26443] some other informations boring
MMDOODODODODNJBCIOICICVOCICVCPCCM
>contig_033652.1_24 [25507 - 26529] species with informations 
AJGSIVPDYVPDYVDPYVDPYDVDYVPVYVIYVDPIDVYPDIVYDPIYVDPIDVYPDIVP
PUDVPIYDVPDIVPDIDVPDVPDIVDPVDIVPDIVPDIVDPIDVIDVPDDIVPDDVPDVD
DDGGDDGDDIDIDDFDUDUDTTUDDUCDUDCDCC

我想以列表格式仅提取以下信息:

名单:

[[1]]
[1] "Nscaffold_033778.1_22" "24674"        "24880"       

[[2]]
[1] "NC_0337652.1_23" "26291"        "26443"       

[[3]]
[1] "contig_033652.1_24" "25507"         "26529"  

有人有想法吗??

  • 列表的第一个元素是">"符号之后的部分,
  • 列表的第二个元素是[] 中的first number
  • 列表的第三个元素是[] 中的second number

【问题讨论】:

  • 文件/数据格式是什么?
  • 你尝试过什么想法但没有成功?

标签: r regex


【解决方案1】:

我们可以读取带有readLinesgrep 行的文件,提取相关信息并拆分

strsplit(sub("^>(\\S+)\\s+\\[(\\d+)\\D+(\\d+)\\].*", "\\1,\\2,\\3", 
    grep(">", lines, value = TRUE)), ",")

-输出

[[1]]
[1] "Nscaffold_033778.1_22" "24674"                 "24880"                

[[2]]
[1] "NC_0337652.1_23" "26291"           "26443"          

[[3]]
[1] "contig_033652.1_24" "25507"              "26529"      

数据

lines <- readLines('file.txt')

【讨论】:

    【解决方案2】:

    如果vec 持有文件内容,

    vec <- readLines(...)
    

    然后

    strcapture("^>(.*) *\\[(\\d+)\\D*(\\d+).*",
               vec[grepl("^>", vec)],
               list(x="",y="",z=""))
    #                        x     y     z
    # 1 Nscaffold_033778.1_22  24674 24880
    # 2       NC_0337652.1_23  26291 26443
    # 3    contig_033652.1_24  25507 26529
    

    我知道这不是严格要求的格式。我提供它作为替代品,因为它可以随时访问所有内容。此外,如果您打算对列 yz 进行整数化,则可以通过将第三个参数 (proto=) 替换为 list(x="", y=1L, z=1L) 来完成内置操作,如

    str(
      strcapture("^>(.*) *\\[(\\d+)\\D*(\\d+).*",
                 vec[grepl("^>", vec)],
                 list(x="",y="",z=""))
    )
    # 'data.frame': 3 obs. of  3 variables:
    #  $ x: chr  "Nscaffold_033778.1_22 " "NC_0337652.1_23 " "contig_033652.1_24 "
    #  $ y: chr  "24674" "26291" "25507"
    #  $ z: chr  "24880" "26443" "26529"
    
    str(
      strcapture("^>(.*) *\\[(\\d+)\\D*(\\d+).*",
                 vec[grepl("^>", vec)],
                 list(x="",y=1L,z=1L))
    )
    # 'data.frame': 3 obs. of  3 variables:
    #  $ x: chr  "Nscaffold_033778.1_22 " "NC_0337652.1_23 " "contig_033652.1_24 "
    #  $ y: int  24674 26291 25507
    #  $ z: int  24880 26443 26529
    

    【讨论】:

      【解决方案3】:

      你可以使用 {unglue} :

      data <- c(">Nscaffold_033778.1_22 [24674 - 24880] some information",
        ">NC_0337652.1_23 [26291 - 26443] some other information",
        ">contig_033652.1_24 [25507 - 26529] species with informations")
      
      unglue::unglue_data(data, ">{id} [{n1} - {n2}]{}")
      #>                      id    n1    n2
      #> 1 Nscaffold_033778.1_22 24674 24880
      #> 2       NC_0337652.1_23 26291 26443
      #> 3    contig_033652.1_24 25507 26529
      

      reprex package (v2.0.1) 于 2021 年 12 月 17 日创建

      【讨论】:

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