遍历所有子目录并读取每个子目录中的文件

时间:2020-01-29 16:07:23

标签: r

我有一个来自dbcan的输出目录,每个示例输出都在一个子目录中。我需要遍历每个子目录,将其读入R文件,称为Overview.csv。

for (subdir in list.dirs(recursive = FALSE)){
  data = read.csv(file.path(~\\subdir, "overview.csv"))
}

我不确定每个子目录在read.csv中如何处理变化的文件路径。任何帮助都会得到应用。

2 个答案:

答案 0 :(得分:2)

在前面,~\\subdir(不是字符串)显然是有问题的。由于subdir已经是字符串,因此使用file.path是正确的,但仅使用变量。如果您担心相对还是绝对,则始终可以使用normalizePath(list.dirs())对路径进行规范化,尽管使用`

并不会真正改变事情。

需要考虑的几件事。

  1. 恒定地重新分配给同一变量没有帮助,因此您需要分配给list的元素或其他内容(例如,下面的lapply)。 (我也认为data作为变量名是有问题的。虽然现在可以正常工作,但如果您曾经运行脚本的一部分而不分配给data,您将引用函数,可能会导致诸如Error in data$a : object of type 'closure' is not subsettable之类的令人困惑的错误;由于closure实际上只是一个带有其封闭的名称空间/环境的函数,所以这只是说“您试图对一个功能”。)

  2. 我认为pattern=full.names=都可能对从使用list.dirs切换到list.files有用,例如

    datalist <- list()
    # I hope recursion doesn't go too deep here
    filelist <- list.files(pattern = "overview.csv", full.names = TRUE, recursive = TRUE)
    for (ind in seq_along(filelist)) {
      datalist[[ind]] <- read.csv(filelist[ind])
    }
    # perhaps combine into one frame
    data1 <- do.call(rbind, datalist)
    
  3. 读取大量文件并对所有文件执行相同的操作建议lapply。这是数字2的紧凑版本:

    filelist <- list.files(pattern = "overview.csv", recursive = TRUE, full.names = TRUE)
    datalist <- lapply(filelist, read.csv)
    data1 <- do.call(rbind, datalist)
    

    注意:如果您确实只需要一个一级级别的子目录,则可以使用以下方法解决该问题:

    filelist <- list.files(list.dirs(somepath, recursive = FALSE),
                           pattern = "overview.csv", full.names = TRUE)
    

    或者您可以将深度限制在 以内,例如https://stackoverflow.com/a/48300309中的list.dirs.depth.n

答案 1 :(得分:1)

我认为应该是这样。

for (subdir in list.dirs(recursive = FALSE)){
    data = read.csv(paste0(subdir, "overview.csv"))
}
相关问题