【问题标题】:How to repeatedly merge groups of files from the same folder?如何重复合并同一文件夹中的文件组?
【发布时间】:2015-12-23 18:02:30
【问题描述】:

我有 1 个文件夹,其中包含 1000 多个文件(标题格式 = 5555_45)。前 4 位始终包含属于同一文件且应合并的文件的标识码。因此,我需要合并包含相同代码的文件组并将其保存在另一个文件夹中。

下面的代码允许我合并文件夹中的所有文件并保存它,并将前四位数字作为变量包含在内。

files <- list.files("PATH", pattern="*.TXT")
file.list <- lapply(files, read.table)
setattr(file.list, "names", files)
masterfilesales <- rbindlist(file.list, idcol="id")[, id := substr(id,1,4)]
write.table(masterfilesales, "PATH/5555.txt", sep="\t")

是否可以调整此代码(当我想合并一个文件夹中的所有文件时它可以工作)重复执行此操作以处理我的文件夹中包含相同前 4 位数字的文件?

【问题讨论】:

  • 看起来你正在做的是堆叠数据帧,而不是合并它们。
  • 我想如果你搜索[r] do.call rbind read.csv list.files你会发现几个重复的。这与 Coursera R 课程之一中作为家庭作业提出的问题是同构的。

标签: r loops merge repeat


【解决方案1】:

下面的代码使用sapply 而不是lapply 读取数据,因为sapply 自动使用文件名作为每个列表元素的名称。然后我们rbind每组文件都有相同的四位数前缀。最后,我们使用四位前缀作为文件名来写入每个新的堆叠数据帧。您可以一步完成所有这些,但我将它们分开是希望代码更容易理解。

# Use sapply so that name of each list element will be the file name
file.list = sapply(files, read.table, simplify=FALSE)

# rbind each group of data frames that have the same four-digit prefix
file.list.stacked = sapply(unique(substr(names(file.list), 1, 4)), function(x) {
  do.call(rbind, file.list[grep(x, names(file.list))])
}, simplify=FALSE)

# Write the each of the new "stacked" data frames that we've just created
lapply(names(file.list.stacked), function(df) {
  write.table(file.list.stacked[[df]], file=paste0(df, ".txt"), sep="\t")
})

【讨论】:

  • 谢谢,如果我限制该文件夹中文件的大小,这将非常有效,但考虑到我有大约 200GB 的数据(单个文件不会超过 15GB,应该在我运行它的服务器上没问题)。有没有办法绕过您创建的大文件列表?
猜你喜欢
  • 2014-05-20
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多