我有一个gff文件,如下所示,每一列按选项卡分开。
头(a,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 Exon 5700 5043 Exon 5520 5691 Exon 6372 6578 Exon 7139 7398 Exon 8010 8169 >gi 44805666 Exon 7139 7398 Exon 8010222983.1 Exon 36 948
我对改变文件格式非常陌生,所以我应该如何解决这个问题。我不确定整形包能不能解决这个程序。如果可以的话,请给我举个例子。
谢谢你的建议
发布于 2014-08-15 07:45:12
我对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+。https://stackoverflow.com/questions/25322568
复制相似问题