【问题标题】:How do I iterate over several files in several folders?如何遍历多个文件夹中的多个文件?
【发布时间】:2021-09-26 15:27:28
【问题描述】:

我有 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 个文件?我该如何编程?我很乐意为您提供任何帮助!

【问题讨论】:

  • 您是指目录/文件夹而不是文件吗?
  • 两个文件夹中的文件是否有匹配的名称,或者是否有其他方法可以知道文件夹 A 和文件夹 B 中的哪些文件配对?
  • @user438383:是的,对不起! 2 个不同的目录 A 和 B!
  • @Miff:就像:文件夹 A 中的 1_1_Alpha.csv 和文件夹 B 中的 1_1_Beta.csv;文件夹 A 中的 3_1_Alpha.csv 和文件夹 B 中的 3_1_Beta.csv 等等……这些是“对”!

标签: r iteration


【解决方案1】:

我认为mapply 在这里很有用。目的是用相应的“B”文件迭代每个“A”文件; order 和 set-membership(文件存在)很关键,否则汇总统计数据可能会产生误导。

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 时这不会“报警”。

【讨论】:

  • Bbase &lt;- gsub("Beta", "", basename(Afiles)) 中的错字,应该是Bfiles
  • 谢谢@RuiBarradas,我正在尝试未经测试的代码的脆弱壮举......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2021-07-18
相关资源
最近更新 更多