2016-10-03 179 views
0

我想导入文件夹中的所有文件,转换文件,然后使用相同的名称导出它们,但使用不同的扩展名。在我的特定情况下,我想150个承上启下文件(.nex)转换为FASTA文件(.fasta)循环遍历R中的文件夹中的所有文件

这是怎样的代码看起来如果我去做了一个接一个:

library(ape) 
gen1 <- read.nexus.data("gen1.nex") #import nexus file 
write.dna(gen1, file = "./fastas/gen1.fasta", format = "fasta") #export fastafile 

但现在我无法在一次运行中完成150个文件的工作循环。这是我的尝试:

library(ape) 
filenames = dir(pattern="*.nex") 
for (i in filenames){ 
i <- read.nexus.data(i) 
write.dna(i, file = "./fastas/i.fasta", format = "fasta") 
} 

当我运行这段代码,我只得到一个名为“i.fasta”一个文件,而不是150个文件名为gen1.fasta,gen2.fasta,DNAsequence1.fasta,DNAsequence2.fasta等等。我应该如何改变for-loop来使其工作正确?使用粘贴功能时

+1

您可能需要'paste0( “./ fastas /” I)' – akrun

+1

或'sprintf的( “./ fastas /%s.fasta”,我)' – plannapus

+0

感谢你们的意见。使用“paste0”,我得到错误:内部'粘贴'的非字符串参数;而与sprintf,我得到的错误:不支持的类型 – PaulH

回答

1

你需要1)包括i字符串给FASTA文件名中的数值,2)不重写i当你加载你的nexus文件。

library(ape) 
filenames = dir(pattern="*.nex") 
for (i in filenames){ 
    dat <- read.nexus.data(i) 
    write.dna(dat, file = sprintf("./fastas/%s.fasta", i), format = "fasta") 
} 
0

解决方案很简单:

library(ape) 
filenames = dir(pattern="*.nex") 
for (f in filenames){ 
    i <- read.nexus.data(f) 
    write.dna(i, file = paste0("./fastas/",f,".fasta"), format = "fasta") 
} 
相关问题