我有一个来自dbcan的输出目录,每个示例输出都在一个子目录中。我需要遍历每个子目录,将其读入R文件,称为Overview.csv。
for (subdir in list.dirs(recursive = FALSE)){
data = read.csv(file.path(~\\subdir, "overview.csv"))
}
我不确定每个子目录在read.csv
中如何处理变化的文件路径。任何帮助都会得到应用。
答案 0 :(得分:2)
在前面,~\\subdir
(不是字符串)显然是有问题的。由于subdir
已经是字符串,因此使用file.path
是正确的,但仅使用变量。如果您担心相对还是绝对,则始终可以使用normalizePath(list.dirs())
对路径进行规范化,尽管使用`
需要考虑的几件事。
恒定地重新分配给同一变量没有帮助,因此您需要分配给list
的元素或其他内容(例如,下面的lapply
)。 (我也认为data
作为变量名是有问题的。虽然现在可以正常工作,但如果您曾经运行脚本的一部分而不分配给data
,您将引用函数,可能会导致诸如Error in data$a : object of type 'closure' is not subsettable
之类的令人困惑的错误;由于closure
实际上只是一个带有其封闭的名称空间/环境的函数,所以这只是说“您试图对一个功能”。)
我认为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)
读取大量文件并对所有文件执行相同的操作建议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"))
}