将lfile中的元素提取到R中的列表中

Posted

技术标签:

【中文标题】将lfile中的元素提取到R中的列表中【英文标题】:Extract elements from lfile into a list in 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

【问题讨论】:

文件/数据格式是什么? 你尝试过什么想法但没有成功? 【参考方案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 日创建

【讨论】:

以上是关于将lfile中的元素提取到R中的列表中的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用prolog将变量分配/提取到列表列表中的不同元素

R 中的维恩图 - 提取每个维恩区域的元素,甚至使其具有交互性

python把列表前几个元素提取到新列表

从列表中提取值以将它们分配为 R 中的新变量

使用R中的稀疏矩阵从矢量中提取元素,而不转换为密集矩阵

python提取list中的元素