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

How to combine FASTA sequence according to sequence id?

我有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个基因组合起来。例如,在 strain1.fasta:

AAAGGG

在strain2.fasta中:

GGGCCC

我如何在 R 中执行此操作?

这里有一个 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 '[=11=] ~ /^>/ {i=substr([=11=],2); next;} i != -1 {printf "%s", [=11=] >> "file"i; i=-1;}' gene*