我有一个文件夹,其中包含以下名称的 .txt 文件:
A_COR_001_I
A_COR_001_II
A_COR_002_I
A_COR_002_II
A_COR_003_I
A_COR_003_II
A_COR_003_III
A_COR_004_I
A_COR_004_II
A_COR_004_III
A_COR_004_IV
...
每个字符串末尾的罗马数字表示特定文档的最终草稿,由前面的阿拉伯数字标识,如 002。我正在尝试使用 list.files() 函数仅提取具有正则表达式模式的最终草稿,但问题是每个文档的草稿数量不可预测,所以我需要一种方法将每个文档的草稿分组在一起并挑选出编号最高的草稿,因此是 A_COR_004_IV 而不是 A_COR_004_III 或任何其他。关于如何继续有什么想法吗?提前致谢!
Base R 具有一项
as.roman()
功能,可以简单操作……罗马数字。因此,根据最后一个下划线之前的内容(即)将文件按文件名拆分为列表
"A_COR_001"
,"A_COR_004"
然后找到带有罗马数字的元素max()
(即,最后一个下划线后的最大数值)。我想这不会是个问题,但请注意文档指出:
有趣的是,这实际上只是
structure(NA_integer_, class = "roman")
。顺便说一句,
list.files()
将按字典顺序返回结果,如果您有最多 8 个版本的文件,这就是您想要的顺序(直到IX
)。所以你只需执行lapply(split(files, sub("_[^_]+$", "", files)), tail, 1)
。数据
类似于:
创建于 2024-10-01,使用reprex v2.1.0
假设文件名不一定按特定顺序排列,定义
stem
作为子字符串直到最后一个下划线,并且ver
将版本号转换为数字。然后提取具有最大版本的文件名作为其词干。
这仅使用基础 R,是矢量化的并且不使用 *apply。
如果已知文件已经排序,就像问题中的情况一样,那么可以这样做:
笔记