【问题标题】:Merging files by name and condition in r在r中按名称和条件合并文件
【发布时间】:2019-12-12 12:23:04
【问题描述】:

我在一个看起来像这样的文件夹中有一系列文件;

B_1.csv、B_1_2.csv、B_2.csv、B_2_2.csv、B_3.csv、B_4.csv、B_4_1.csv

基本上,我希望将任何包含“_2”的文件合并到它们的进程号(即 B_1_2.csv 与 B_1.csv 合并)。更复杂的是,某些文件(例如 B_3.csv)没有第二个文件 (_2),因此需要忽略。我想不出一个简单的方法来完成这个。任何帮助将不胜感激。非常感谢

【问题讨论】:

  • “将任何包含'_2'的文件合并到它们的进程号”,所以,B_2.csv 包含"_2",它是否与B_1.csv 一起合并B_1_2.csv?
  • 如果这不是你想要的,一个让回答更简单的好方法可能是删除文件名中的第一个_,或者用- 替换它。 oldnames = list.files(pattern = ".csv$"); newnames = sub("_", "-", oldnames); file.rename(from = oldnames, to = newnames)
  • 为了澄清我确实希望将数据帧逐行绑定在一起。当我说“将包含'_2'的任何文件合并到它们的进程号”时 - 我的意思是文件名中的进程号。例如; B_1_2.csv 绑定到 B_1.csv 的底部,B_2_2.csv 绑定到 B_2.csv 的底部
  • 嗨@PhilRoberts,感谢您的澄清。在那种情况下,我的答案需要一些我目前没有时间做的调整。我会删除它。

标签: r


【解决方案1】:

当然,未经测试,但这应该有效(或接近它的东西):

# identify CSV files
files = list.files(pattern = "csv$")

# look for ones that need merging
to_merge = grep("[0-9]_2\\.csv", files, value = TRUE)
# identify what they should be merged to
merge_target_file = sub("_2.csv", ".csv", to_merge, fixed = TRUE)

# make sure those exist
problems = setdiff(merge_target_file, files)
if(length(problems)) stop(problems, " not found, need merge targets.")

# read in the data
merge_target = lapply(merge_target_file, read.csv, stringsAsFactors = FALSE)
to_merge = lapply(to_merge, read.csv, stringsAsFactors = FALSE)

# merge and write
for(i in seq_along(merge_target)) {
  write.csv(rbind(merge_target[[i]], to_merge[[i]]), file = merge_target_file[i])
}

【讨论】:

  • 嗨 Gregor,我一直在尝试实现这一点,但发现了一些问题。首先,我假设“文件”应该包含在“子”函数中——目前只有 x 不存在。其次,在这种情况下,grep 仅返回列表中“_2”的时间顺序,例如int [1-8] 5 7 10 12 14 16 19 21。不会; to_merge = list.files(pattern = "_2") 更合适?非常感谢
  • 修复它,将value = TRUE 添加到grep 以便它返回文件名,并添加to_merge 作为sub 的参数。您可以通过使用"[0-9]_2\\.csv" 作为list.files 模式来跳过grep 步骤,但是您没有得到“确保这些存在”的机会来检查合并目标是否已经存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多