【发布时间】:2021-07-06 00:18:35
【问题描述】:
我有一个运行良好的有点复杂的脚本。它导入多个.csvs,将它们组合、调整、重新排序并将它们写成多个新的.csvs。都很好。
问题是我需要在 2100 个文件中的每一个上运行这个脚本。每个.csv 文件都有一个包含七位或八位非数字字符串的名称,该字符串还具有其他特定标识符。有许多具有相同字符串后缀的文件,并且脚本可以同时处理所有文件。命名系统示例:
gfdlesm2g_45Fall_17100202.csv
ccsm4_45Fall_10270102.csv
bnuesm_45Fall_5130205.csv
mirocesmchem_45Fall_5010007.csv
脚本以fnames <- dir("~/Desktop/modified_files/", pattern = "*_45Fall_1030001.csv")开头
在这种情况下,我需要将“1030001”替换为下一个数字。现在,每次脚本完成时,我都在 RStudio 中使用查找和替换来替换七(或八)位数字。我知道必须有比手动为 2100 个文件执行此操作更好的方法。
我发现的所有研究都是在数据框或其他任何内容中进行迭代,在列或行中,我无法处理如何使这项工作满足我的需要。
我在想,如果我把所有数字(真的是名字)做成一个向量,比如"01080204", "01090003", "01100001", "18020116", "18020125", "15080303", "16020301", "03170006", "04010101", "04010201", etc
必须有一种方法可以在代码中说“现在选择下一个名称,然后运行脚本”。我查看了lapply, mapply, sapply 家庭,似乎无法弄清楚。
【问题讨论】:
-
我不明白为什么
sapply或lapply没有做你想做的事。有一个list.files()函数应该提供一个向量,该向量可以用作您描述的任何一个的第一个参数。使用这些术语对 SO 进行搜索,您会发现数百个被问及已回答的问题。如果你明智地选择你的模式参数,比如“45Fall”,你甚至不需要做任何替换。 -
我没有说他们没有做我想要的,我说我不知道如何使用它们。我完全是自学成才,只做了 2 1/2 个月。我尝试了您的模式搜索建议并得到了
Error: cannot allocate vector of size 8 Kb。 -
你试过了。某物。但是你没有edit你的问题主体来展示“它”到底是什么。而且你没有显示“什么”“它”正在看到一些。
-
您要查找的文件名模式是什么?例如,如果您希望所有文件都遵循
'_45Fall_somenumbers.csv'模式,您可以尝试fnames <- list.files("~/Desktop/modified_files/", pattern = "*_45Fall_\\d+\\.csv$")。fnames有你想要的文件吗? -
@RonakShah 谢谢,不。它似乎使用了上一季脚本中的“somenumbers”(我一直在手动操作),并结合上一季。完整的脚本不仅包含 Fall 部分,还包含 Win、Spr、Sum 部分。但是我只使用了一个部分,我使用了 Fall,但我得到了“45Sum”的结果。我不知道你发送的代码应该是什么意思,但它并没有选择所有的“一些数字”,它只给出了一组结果。