如何根据序列ID组合FASTA序列?

时间:2018-09-29 11:33:32

标签: r bioinformatics fasta

我有9个FASTA文件,代表9个基因的DNA测序。

每个FASTA文件包含121个序列,代表121个菌株。每个序列的名称是每个菌株的ID。

但是,在每个文件中,ID都没有排序,例如在gene1.fasta中:

>1
AAA
>16
TTT
>2
GGG
...

在gene2.fasta中:

>2
CCC
>34
AAA
>1
GGG
...

我想将这9个基因的FASTA文件更改为121个菌株FASTA文件,在每个文件中,只需将9个基因组合为一个菌株。例如,在train1.fasta中:

AAAGGG

strain2.fasta中的

GGGCCC

如何在R中做到这一点?

1 个答案:

答案 0 :(得分:0)

这是根据要求在R中提供的解决方案,它使用Biostrings包来读取fasta文件。

它可以工作,但是我不得不说这是我很长时间以来编写的最丑陋的代码。我只是想看看是否能以某种方式完成此任务-这不是100%的最佳解决方案。

library("Biostrings")
library("tidyverse")

convertStringSet = function(seq){
  return(df = data.frame("names" = names(seq), "seq" = paste(seq)))
}

# change the path accordingly
filenames = list.files("/home/x/y/z", pattern="gene*", full.names=TRUE)%>%
  lapply(readDNAStringSet)

fastaDF = filenames %>% lapply(convertStringSet) %>% 
  reduce(full_join, by = "names") %>% 
  unite("seq", -1,  sep="")

writeOutput = function(x){

  header = paste(">",x[1],sep="")
  fileName = paste("strain",x[1],".fasta",sep="")

  writeLines(c(header,x[2]), fileName)
}

apply(fastaDF, 1, writeOutput)

或者,如果您使用的是UNIX系统,则该awk行应提供相同的结果:

awk '$0 ~ /^>/ {i=substr($0,2); next;} i != -1 {printf "%s", $0 >> "file"i; i=-1;}' gene*