【问题标题】:How to loop over files in different directories如何遍历不同目录中的文件
【发布时间】:2013-09-11 21:11:50
【问题描述】:

我想遍历多个文件并对它们应用一个函数。问题是这些文件都位于不同但名称相似的目录中。通路模式类似,但数量会根据它所涉及的家庭而变化。

例如,我的代码是这样写的:

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 也一样。
  • 你是对的。但是,“for(i in 1:numfiles)”的用法仍然存在问题……我使用正确吗?
  • @user2726449 是 all 您希望包含在 smith 文件夹下的子目录中的文件,并且 only您想要的文件格式为"Family....txt"?
  • 所有 Family 子目录都在 Smith 目录/文件夹下。在每个家庭子目录(即家庭i)中,我想调用同一个文件(文件名完全相同,但编号(i)根据它所指的家庭而变化)。我想遍历这些特定文件。例如...对于家庭 1a,文件在此处:“/home/smith/Family1a/Family1a.txt”,但对于家庭 2,文件在此处:“/home/smith/Family2/Family2.txt”。
  • 你想忽略Family1a/Family2.txt吗?意思是:文件名总是目录名+txt吗?还是要读取子目录下的所有txt文件?

标签: r loops


【解决方案1】:

看看?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 我已经把这些都输入了,准备好了。太快! :-)
  • 非常感谢 - 第二个解决方案实际上帮助了我很多。不得不改变一些事情,但它最终奏效了。
猜你喜欢
  • 2011-06-22
  • 2021-07-09
  • 2014-10-02
  • 2022-01-02
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多