【问题标题】:R -find and replace within a script, iteratively [duplicate]R - 在脚本中查找和替换,迭代地[重复]
【发布时间】: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 家庭,似乎无法弄清楚。

【问题讨论】:

  • 我不明白为什么 sapplylapply 没有做你想做的事。有一个 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”的结果。我不知道你发送的代码应该是什么意思,但它并没有选择所有的“一些数字”,它只给出了一组结果。

标签: r replace iteration


【解决方案1】:

如果您正在寻找文件_45Fall_ 中的模式,您可以使用list.files

fnames <- list.files("~/Desktop/modified_files/", pattern = "*_45Fall_\\d+\\.csv$")

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2016-04-12
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多