我有 2 个文件夹(文件夹 A 和文件夹 B),每个文件夹都有大约 900 个 .csv 文件。现在我想打开文件夹 A 中的 1 个 csv 文件和文件夹 B 中的 1 个 csv 文件,并想对它们进行一些计算。然后结果(只是一个数字统计值)应该保存在一个单独的列表中。
之后,应该删除两个导入的 cvs 文件,然后我获取下一个 csv 文件:下一个来自文件夹 A,下一个来自文件夹 B。
配对就像:文件夹 A 中的 1_1_Alpha.csv 与文件夹 B 中的 1_1_Beta.csv -> 文件夹 A 中的 3_1_Alpha.csv 与文件夹 B 中的 3_1_Beta.csv 等等......
有谁知道这是否可能?是否有一个包可以同时遍历 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 时,这不会“报警”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句