1

我想从一个文件夹中导入所有文件,转换文件,然后以相同的名称导出它们,但扩展名不同。在我的具体情况下,我想将 150 个 nexus 文件 (.nex) 转换为 fasta 文件 (.fasta)

如果我一一执行,这就是代码的外观:

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

但是现在我无法制作一个有效的 for 循环来一次运行所有 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 循环以使它工作正常吗?

4

3 回答 3

1

使用粘贴功能时解决方案非常简单:

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")
}
于 2016-10-03T09:53:28.110 回答
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")
}
于 2016-10-03T09:54:37.400 回答
0

不时尚的东西,但效果很好

library(ape)
tmp <- list.files(pattern = "*.nex")
genes <- lapply(tmp, read.nexus.data)
for (i in 1:length(tmp))
  write.dna(genes[[i]], file = paste(tmp[i], ".fasta"), format = "fasta")
于 2018-09-06T16:11:06.640 回答