如何在目录层级可变场景下获取同名文件的所有路径以支持rbind操作
原生R(Base R)实现(无需安装第三方包)
直接用内置的list.files()递归遍历所有层级目录,不受文件夹结构差异影响,核心代码:
# 替换"你的根目录路径"为实际要扫描的顶层文件夹路径 file_paths <- list.files( path = "你的根目录路径", pattern = "^results\\.csv$", # 正则锚定完全匹配文件名,避免误匹配 full.names = TRUE, # 返回完整存储路径,而非仅文件名 recursive = TRUE, # 递归遍历所有子文件夹,适配任意层级深度的目录结构 include.dirs = FALSE, # 排除同名文件夹,仅匹配普通文件 ignore.case = FALSE # 需要兼容大小写(如Results.csv)可改为TRUE )
参数说明:
pattern中的^表示文件名开头,$表示文件名结尾,\\.转义了正则规则里的通配符.,确保不会匹配到如results1csv、old_results.csv这类不符合要求的文件- 要匹配其他文件名时,仅需修改
pattern的正则内容即可,比如匹配所有csv文件可改为"\\.csv$"
第三方包实现(适合高频文件操作场景)
如果经常需要处理批量文件,推荐用fs包,语法更简洁,参数逻辑更直观:
# 首次使用先安装 install.packages("fs") library(fs) file_paths <- dir_ls( path = "你的根目录路径", regexp = "^results\\.csv$", type = "file", # 仅匹配文件,自动排除同名文件夹 recurse = TRUE # 递归遍历所有子目录 )
dir_ls()默认返回完整存储路径,不需要额外设置参数。
后续对接rbind操作的配套代码
拿到所有匹配路径后,可以直接批量读取合并,根据文件量选择对应方案:
- 轻量场景(文件数少)用原生函数即可:
merged_data <- do.call(rbind, lapply(file_paths, read.csv))
- 大量文件场景推荐用
data.table的高效函数,读取和合并速度远快于原生实现:
# 首次使用先安装 install.packages("data.table") library(data.table) # rbindlist自动适配不同文件的列结构,列名不一致时会自动填充NA,无需提前对齐 merged_data <- rbindlist(lapply(file_paths, fread))
常见注意点
- 优先使用绝对路径(如
"C:/项目/数据根目录"、"/home/user/项目/数据根目录"),避免相对路径受R工作目录变动影响 - 匹配完成后可以直接运行
print(file_paths)查看所有路径,验证是否漏扫或误匹配 - 如果需要排除特定子目录的文件,可以在得到路径后用
file_paths[!grepl("需要排除的子目录名", file_paths)]过滤
内容的提问来源于stack exchange,提问作者MCS
相关产品推荐
相关产品推荐

