如何遍历多个文件夹中的多个文件?
How do I iterate over several files in several folders?
我有 2 个文件夹(文件夹 A 和文件夹 B),每个文件夹都有大约 900 个 .csv 文件。
现在我想打开文件夹 A 中的 1 个 csv 文件和文件夹 B 中的 1 个 csv 文件,并想对它们进行一些计算。然后结果(只是一个数字统计值)应该保存在一个单独的列表中。
之后应该删除两个导入的 cvs 文件,然后我获取下一个 csv 文件:下一个来自文件夹 A,下一个来自文件夹 B。
配对方式如下:1_1_Alpha.csv 来自文件夹 A,1_1_Beta.csv 来自文件夹 B -> 3_1_Alpha.csv 来自文件夹 A,3_1_Beta.csv 来自文件夹 B,依此类推。 ..
有人知道这是否可行吗?是否有一个包可以同时遍历 2 个文件?我该如何编程?我很乐意提供任何帮助!
我觉得mapply
在这里很有用。目的是用相应的“B”文件迭代每个“A”文件; order 和 set-membership (file-existence) 是关键,否则汇总统计可能会无声地误导。
Afiles <- sort(list.files("A", pattern = "csv$", full.names = TRUE))
Bfiles <- sort(list.files("B", pattern = "csv$", full.names = TRUE))
## double check file match between the two
Abase <- gsub("Alpha", "", basename(Afiles))
Bbase <- gsub("Beta", "", basename(Bfiles))
AnotB <- !Abase %in% Bbase
if (length(AnotB)) {
warning("files in 'A' not in 'B': ", paste(sQuote(Afiles[AnotB]), FALSE), collapse = ", "))
Afiles <- Afiles[!AnotB]
}
BnotA <- !Bbase %in% Abase
if (length(BnotA)) {
warning("files in 'B' not in 'A': ", paste(sQuote(Bfiles[BnotA]), FALSE), collapse = ", "))
Bfiles <- Bfiles[!BnotA]
}
## ensure the same order
Afiles <- Afiles[order(Abase)]
Bfiles <- Bfiles[order(Bbase)]
## one final check ... they need to match
stopifnot(all(gsub("Alpha", "", basename(Afiles)) == gsub("Beta", "", basename(Bfiles))))
ABstats <- mapply(function(ax, bx) {
# some statistic
return(nrow(ax) - nrow(bx))
}, lapply(Afiles, read.csv), lapply(Bfiles, read.csv))
另一个选项(用于相同文件配对)类似于:
Afiles <- list.files("A", pattern = "csv$", full.names = TRUE)
Bfiles <- gsub("^A/", "B/", gsub("Alpha.csv", "Beta.csv", Afiles))
keep <- file.exists(Bfiles)
Afiles <- Afiles[keep]
Bfiles <- Bfiles[keep]
虽然当 B 文件存在但不匹配 A 时,这不会“报警”。
我有 2 个文件夹(文件夹 A 和文件夹 B),每个文件夹都有大约 900 个 .csv 文件。 现在我想打开文件夹 A 中的 1 个 csv 文件和文件夹 B 中的 1 个 csv 文件,并想对它们进行一些计算。然后结果(只是一个数字统计值)应该保存在一个单独的列表中。
之后应该删除两个导入的 cvs 文件,然后我获取下一个 csv 文件:下一个来自文件夹 A,下一个来自文件夹 B。
配对方式如下:1_1_Alpha.csv 来自文件夹 A,1_1_Beta.csv 来自文件夹 B -> 3_1_Alpha.csv 来自文件夹 A,3_1_Beta.csv 来自文件夹 B,依此类推。 ..
有人知道这是否可行吗?是否有一个包可以同时遍历 2 个文件?我该如何编程?我很乐意提供任何帮助!
我觉得mapply
在这里很有用。目的是用相应的“B”文件迭代每个“A”文件; order 和 set-membership (file-existence) 是关键,否则汇总统计可能会无声地误导。
Afiles <- sort(list.files("A", pattern = "csv$", full.names = TRUE))
Bfiles <- sort(list.files("B", pattern = "csv$", full.names = TRUE))
## double check file match between the two
Abase <- gsub("Alpha", "", basename(Afiles))
Bbase <- gsub("Beta", "", basename(Bfiles))
AnotB <- !Abase %in% Bbase
if (length(AnotB)) {
warning("files in 'A' not in 'B': ", paste(sQuote(Afiles[AnotB]), FALSE), collapse = ", "))
Afiles <- Afiles[!AnotB]
}
BnotA <- !Bbase %in% Abase
if (length(BnotA)) {
warning("files in 'B' not in 'A': ", paste(sQuote(Bfiles[BnotA]), FALSE), collapse = ", "))
Bfiles <- Bfiles[!BnotA]
}
## ensure the same order
Afiles <- Afiles[order(Abase)]
Bfiles <- Bfiles[order(Bbase)]
## one final check ... they need to match
stopifnot(all(gsub("Alpha", "", basename(Afiles)) == gsub("Beta", "", basename(Bfiles))))
ABstats <- mapply(function(ax, bx) {
# some statistic
return(nrow(ax) - nrow(bx))
}, lapply(Afiles, read.csv), lapply(Bfiles, read.csv))
另一个选项(用于相同文件配对)类似于:
Afiles <- list.files("A", pattern = "csv$", full.names = TRUE)
Bfiles <- gsub("^A/", "B/", gsub("Alpha.csv", "Beta.csv", Afiles))
keep <- file.exists(Bfiles)
Afiles <- Afiles[keep]
Bfiles <- Bfiles[keep]
虽然当 B 文件存在但不匹配 A 时,这不会“报警”。