遍历R中文件夹中的所有文件

loop over all files in folder in R

我想从一个文件夹中导入所有文件,转换文件,然后以相同的名称导出它们,但使用不同的扩展名。在我的具体情况下,我想将 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 循环以使其正常工作?

使用粘贴功能解决方法很简单:

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")
}

您需要 1) 在提供 fasta 文件名的字符串中包含 i 的值,2) 在加载您的 nexus 文件时不要重写 i

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")
}

有点不时尚,但效果很好

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")