如何在R语言中按字符串前半部分对.dat文件名分组?
按文件名前缀分组.dat文件的R实现方案
针对你要把成对的.dat文件按共同前缀分组的需求,这里有几种实用的方法,同时先纠正下你现有代码里的一个小问题:
第一步:修正文件过滤的正则表达式
你原代码里的grepl("*.dat$", files)存在正则语法问题——*在正则中是量词(匹配前面字符0次或多次),不是通配符。正确的写法应该用\\.dat$来匹配以.dat结尾的文件:
# 你的自定义目录函数(示例实现) get_directory <- function() { getwd() # 假设返回当前工作目录,可根据你的需求修改 } # 获取目标目录下所有.dat文件 files <- list.files(get_directory()) files <- files[grepl("\\.dat$", files)]
方法一:基础R实现(split函数)
核心思路是先提取每个文件名的共同前缀(比如从2^5-3^3-18-simul.dat中提取2^5-3^3-18),再用split按前缀分组:
# 提取分组标识:去掉最后一个'-'到'.dat'之间的所有内容 group_ids <- sub("-[^-]+\\.dat$", "", files) # 按标识分组,得到列表格式的分组结果 file_groups <- split(files, group_ids)
运行后,file_groups会是一个命名列表:每个列表元素的名称是分组前缀,元素内容是对应组的两个文件名,比如:
$`2^5-3^3-18` [1] "2^5-3^3-18-simul.dat" "2^5-3^3-18-uniform.dat" $`2^7-3^4-33` [1] "2^7-3^4-33-simul.dat" "2^7-3^4-33-uniform.dat"
方法二:tidyverse风格实现(适合管道流)
如果你习惯用tidyverse工具链,可以用str_remove提取分组标识,再用group_split分组:
library(tidyverse) file_groups <- tibble(file_name = files) %>% # 提取分组前缀 mutate(group_id = str_remove(file_name, "-[^-]+\\.dat$")) %>% # 按分组前缀拆分 group_split(group_id, .keep = FALSE)
这种方法得到的是tibble对象的列表,每个元素对应一组文件,方便后续进行数据处理(比如批量读取文件)。
额外提示
如果你的文件名后缀(simul/uniform)是固定的,也可以用更精准的正则来提取分组标识,比如:
group_ids <- sub("-(simul|uniform)\\.dat$", "", files)
这样只会匹配以-simul.dat或-uniform.dat结尾的文件,避免意外匹配其他格式的文件名。
内容的提问来源于stack exchange,提问作者tinker




