如何循环遍历不同目录中的文件

4
我希望能够遍历多个文件并对它们应用一个函数。问题在于这些文件都在不同的目录中,但是目录的名称类似。路径模式相似,但数字会根据所属家族而变化。
例如,我已经编写了以下代码:
for(i in 1:numfiles) {
    olddata <- read.table(paste("/home/smith/Family", i, "/Family", i, ".txt", sep="\t"),
                          header=T)      
    # FUNCTION GOES HERE

    write.table(newdata,
                paste("/home/smith/Family", i, "/Family", i, "test.txt",
                      sep = ",", quote=F, row.names=F)
}

我遇到的问题是家庭编号不按数字顺序排列。有些只用数字标记(例如:2),而其他则在该数字后附加一个字母(例如:1a)。
在每个家庭子目录中(即第i个家庭),我想调用相同的文件(文件名完全相同,但根据所属家庭更改编号(i))。我想循环处理这些特定文件。例如...对于第1a个家庭,文件在这里:"/ home / smith / Family1a / Family1a.txt",但对于第2个家庭,文件在这里:"/ home / smith / Family2 / Family2.txt"。
此外,R不喜欢我的使用numfiles

难道不应该是:paste0("/home/smith/Family",i,"/Family",i,".txt"),sep="\t"吗?看起来你正在使用制表符分隔符粘贴文件路径。对于write.table也是一样。 - harkmug
你说得对。然而,它仍然存在“for(i in 1:numfiles)”使用方面的问题……我使用得正确吗? - user2726449
@user2726449,你想要的所有文件是否都包含在smith文件夹下的子目录中,而且你只想要的文件是以"Family....txt"这种形式吗? - Simon O'Hanlon
所有的家庭子目录都在Smith目录/文件夹下。在每个家庭子目录(即Family i)中,我想调用相同的文件(文件名完全相同,但数字(i)根据所涉及的家庭而改变)。我想循环遍历这些特定的文件。例如...对于1a家庭,文件在这里:"/home/smith/Family1a/Family1a.txt",但对于2家庭,文件在这里:"/home/smith/Family2/Family2.txt"。 - user2726449
你想忽略 Family1a/Family2.txt 吗?这意味着文件名总是目录名加上 txt 吗?或者你想读取子目录中的所有 txt 文件? - sgibb
实际上 - 那是个打错字了(本来应该是 "/home/smith/Family2/Family2.txt")。但文件名总是遵循相似的目录模式。 - user2726449
1个回答

14

看一下?list.files?dir,例如:

files <- list.files("/home/smith", pattern="Family[[:alnum:]]+.txt", recursive=TRUE, full.names=TRUE)

for (currentFile in files) {
  olddata <- read.table(currentFile, header=TRUE)
  ## some code
  write.table(newdata, file=sub(pattern=".txt$", replacement="test.txt", x=currentFile))
}

或者:

dirs <- dir("/home/smith", pattern="Family[[:alnum:]]+$")

fileName <- file.path(dirs, paste0(dirs, ".txt"))
testFileName <- file.path(dirs, paste0(dirs, "_test.txt"))

for (i in seq(along=fileName))

  olddata <- read.table(fileName[i], header=TRUE)
  ## some code
  write.table(newdata, file=testFileName[i])
}

1
+1 我已经把这个全部打好并准备好了。太快了! :-) - Simon O'Hanlon
非常感谢 - 第二个解决方案确实帮了我很多。虽然需要做一些调整,但最终还是成功了。 - user2726449

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接