将gff文件格式更改为zff格式

时间:2014-08-15 07:14:12

标签: r

我有一个gff文件,如下图所示,每个列都用tab分隔。

  

头(5)

      V1        V2   V3   V4   V5 V6 V7 V8
     gi|447604937|gb|AJJZ010637342.1| assembler gene 1059 1513  .  -  .
     gi|447604937|gb|AJJZ010637342.1| assembler mRNA 1059 1513  .  -  .
     gi|447604937|gb|AJJZ010637342.1| assembler exon 1059 1513  .  -  .
     gi|447604937|gb|AJJZ010637342.1| assembler mRNA 1059 1513  .  -  .
     gi|448181314|gb|AJJZ010120701.1| assembler gene 4700 8169  .  +  .
                                                                          V9
                                ID=PASA_cluster_9835;Name=PASA_cluster_9835
                     ID=align_id:87873|asmbl_10255;Parent=PASA_cluster_9835
     ID=exon:align_id:87873|asmbl_10255:1;Parent=align_id:87873|asmbl_10255
     ID=mRNA:align_id:87873|asmbl_10255:1;Parent=align_id:87873|asmbl_10255
                              ID=PASA_cluster_24371;Name=PASA_cluster_24371

我希望将格式更改为

>gi|447604937|gb|AJJZ010637342.1|
Exon  1059    1513
>gi|448181314|gb|AJJZ010120701.1|
Exon  4700    5043
Exon  5520    5691
Exon  6372    6578
Exon  7139    7398
Exon  8010    8169
>gi|448056666|gb|AJJZ010222983.1|
Exon  36  948

我是非常新的更改文件格式,所以我应该如何解决这个问题。我不确定重塑包可以解决这个程序。如果可以的话,请举个例子。

感谢您的建议

1 个答案:

答案 0 :(得分:1)

我不熟悉formats。如果您拥有dput数据会更好。检查这是否有帮助:

 lines1 <- readLines(n=7)
 gi|447604937|gb|AJJZ010637342.1| assembler gene 1059 1513  .  -  .
 gi|447604937|gb|AJJZ010637342.1| assembler mRNA 1059 1513  .  -  .
 gi|447604937|gb|AJJZ010637342.1| assembler exon 1059 1513  .  -  .
 gi|447604937|gb|AJJZ010637342.1| assembler mRNA 1059 1513  .  -  .
 gi|448181314|gb|AJJZ010120701.1| assembler gene 4700 8169  .  +  .
 gi|448181314|gb|AJJZ010120701.1| assemble exon 4700 8169  .  -  . 
 gi|448181314|gb|AJJZ010120701.1| assemble exon 5520 5691  .  -  . 

 lines2 <- grep("exon", lines1,value=T)
 library(stringr)
 v1 <- paste0(">",str_trim(str_extract(lines2, perl('.* (?=assembl)'))))
 v2 <- paste("Exon", str_extract(lines2, perl('(?<=exon )\\d+\\s+\\d+')))
 lapply(split(v2,v1), function(x) read.table(text=x, sep="",stringsAsFactors=F))
 #$`>gi|447604937|gb|AJJZ010637342.1|`
 #   V1   V2   V3
 #1 Exon 1059 1513

 #$`>gi|448181314|gb|AJJZ010120701.1|`
 #   V1   V2   V3
#1 Exon 4700 8169
#2 Exon 5520 5691

或者,如果您需要这样:

 lst1 <- split(v2,v1)
 lines2 <- unlist(Map(`c`, names(lst1), lst1), use.names=F)
 cat(paste(lines2, collapse="\n"), "\n")
 # >gi|447604937|gb|AJJZ010637342.1|
 #Exon 1059 1513
 #>gi|448181314|gb|AJJZ010120701.1|
 #Exon 4700 8169
 #Exon 5520 5691 

您可以使用lines2

write.table写入档案

解释

  • 在前瞻字符串.*

  • 之前提取包括空格(?=assembl)在内的所有内容
  • 对于第二种情况,我们会寻找一种后视模式(?<=exon )并提取数字\\d+,然后是空格\\s+,再次编号\\d+