我有一个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
我是非常新的更改文件格式,所以我应该如何解决这个问题。我不确定重塑包可以解决这个程序。如果可以的话,请举个例子。
感谢您的建议
答案 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+