我目前正在开发一个大型数据集,到目前为止,我可以通过无数的谷歌搜索和长时间的尝试来解决我的所有想法/问题。错误会话非常好。我已经设法使用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解决方法(尚未测试):
不确定两种方式是否有效 - 因此,如果我错了,请纠正我。
答案 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")