在R中转换/转换丰度(OTU)表/ data.frame(到fasta文件)

时间:2015-03-03 20:55:45

标签: r fasta bioconductor mothur

我目前正在开发一个大型数据集,到目前为止,我可以通过无数的谷歌搜索和长时间的尝试来解决我的所有想法/问题。错误会话非常好。我已经设法使用plyr和reshape函数对我的不同数据集进行了一些转换并学到了很多东西,但我认为我已经达到了目前R知识不再对我有帮助的程度。

即使我的问题听起来非常具体(即OTU表和fasta文件),我想我的尝试是跨越许多不同领域(而不仅仅是生物信息学)的常见R应用程序。

现在,我已将参考序列文件与丰富表合并,我想基于此data.frame的信息生成特定文件 - fasta文件。

我的df目前看起来有点像这样:

repSeq     sw.1.102 sw.3.1021 sw.30.101 sw.5.1042 ...
ACCT-AGGA  3        0         1         0
ACCT-AGGG  1        1         2         0
ACTT-AGGG  0        1         0         25
...

生成的文件应如下所示:

>sw.1.102_1
ACCT-AGGA
>sw.1.102_2
ACCT-AGGA
>sw.1.102_3
ACCT-AGGA
>sw.1.102_4
ACCT-AGGG
>sw.3.1021_1
ACCT-AGGG
>sw.3.1021_2
ACTT-AGGG
>sw.30.101_1
ACCT-AGGA
>sw.30.101_2
ACCT-AGGG
...

如您所见,我想使用有关每个样本(即sw.n)的(参考)序列数的信息来创建(fasta)文件。

我对R中的循环没有经验(我只在简单的处理过程中使用了基本循环),但我认为这可以解决这个问题。我从 SeqinR软件包中找到了 write.fasta 函数,但我找不到任何解决方案。 mothur中的 deunique.seqs 命令不起作用,因为它需要一个fasta文件作为输入(我显然没有)。很可能Bioconductor(OTUbase?)上有什么东西,但说实话,我不知道从哪里开始,我很高兴有任何帮助。 我真的很想在R中这样做,因为我喜欢和它一起工作,但任何其他想法也非常受欢迎。

//小编辑:

以下两个答案都非常有效(请参阅我的评论) - 我还发现了两个可能不那么优雅的答案。非R解决方法(尚未测试):

  • 因为我已经有了分类文件和丰富的OTU表,所以我认为mothur命令make.biom可用于创建biom-format file。我还没有使用过biom文件,但我认为有一些工具和脚本可以将biom文件数据再次保存为fasta
  • convert Qiime files to oligotyping format - 这还需要一个分类文件和一个Otu表

不确定两种方式是否有效 - 因此,如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:2)

这里是您的数据,被强制转换为矩阵(对于同类型的矩形数据,这是一种更自然的表示)。

df <- read.delim(textConnection(
    "repSeq     sw.1.102 sw.3.1021 sw.30.101 sw.5.1042
     ACCT-AGGA  3        0         1         0
     ACCT-AGGG  1        1         2         0
     ACTT-AGGG  0        1         0         25"
    ), sep="", row.names=1)
m <- as.matrix(df)

棘手的部分是弄清楚如何对重复的列名称条目进行编号。我通过创建适当长度和未列出的序列来完成此操作。然后我创建了一个包含两行的矩阵,第一行(根据原始矩阵中的条目复制colnames())是id,第二个是序列。

csum <- colSums(m)
idx <- unlist(lapply(csum, seq_len), use.names=FALSE)
res <- matrix(c(sprintf(">%s_%d", rep(colnames(m), csum), idx), # id
                rep(rownames(m)[row(m)], m)),                   # sequence
              nrow=2, byrow=TRUE)

使用writeLines(res, "your.fasta")来写出结果,或使用setNames(res[2,], res[1,])来获取序列的命名向量。

答案 1 :(得分:1)

试试这个,它逐行遍历数据帧并连接序列的重复:

fasta_seq<-apply(df,1,function(x){
        p<-x[1]
        paste(unlist(mapply(function(x,y,z){
                if(as.numeric(y)>0) {paste(">",x,"_",(z+1):(z+y),"\n",p,"\n",sep="")}
        },colnames(df)[-1],as.numeric(x[-1]),c(0,lag(cumsum(as.numeric(x[-1])))[-1]),USE.NAMES=F)),collapse="")                
        })

write(paste(fasta_seq,collapse=""),"your_file.txt")