You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:从子目录递归导入文件并整合至data.frame

我来帮你搞定这个文件合并的需求,你的思路是对的,咱们把代码补全并优化一下,让它更简洁可靠:

先准备好依赖包

首先确保你加载了处理数据和文件的常用包(如果没装先运行install.packages(c("dplyr", "purrr", "readr", "tools"))安装):

library(dplyr)
library(purrr)
library(readr)
library(tools)

完整实现代码

# 设置工作目录到你的IsolatedData文件夹
setwd("~/Documents/IsolatedData")

# 递归获取所有.out文件,带上完整相对路径(这步很关键,方便后续提取目录信息)
file_list <- list.files(pattern = "\\.out$", recursive = TRUE, full.names = TRUE)

# 遍历每个文件,读取数据并添加目录、文件名信息,最后合并成一个data.frame
combined_df <- map_df(file_list, function(file_path) {
  # 读取.out文件:这里假设你的文件是制表符分隔的文本,根据实际格式调整参数
  # 如果文件没有表头,加上col_names = FALSE;分隔符不是制表符就改delim的值
  raw_data <- read_delim(file_path, delim = "\t", show_col_types = FALSE)
  
  # 提取子目录名称:比如文件路径是"./00/tap-4.out",dirname后得到"./00",去掉开头的./
  subdirectory <- sub("^\\./", "", dirname(file_path))
  
  # 提取去掉扩展名的文件名:用tools包的专门函数,比自己写正则更稳妥
  filename <- file_path_sans_ext(basename(file_path))
  
  # 把目录和文件名作为新列添加到数据中
  raw_data %>%
    mutate(
      subdirectory = subdirectory,
      filename = filename
    )
})

关键细节解释

  • full.names = TRUE:让list.files返回完整的相对路径,而不是只返回文件名,这样我们才能准确提取文件所在的子目录
  • tools::file_path_sans_ext:R自带工具包的函数,专门用来移除文件扩展名,不管扩展名是多长都能正确处理,比手动写正则(比如sub("\\.out$", "", ...))更通用
  • map_df:替代你原来的lapply + bind_rows,是tidyverse风格的遍历函数,能自动把每个文件的结果合并成一个data.frame,代码更简洁
  • 读取文件的部分:如果你的.out文件格式是空格分隔,就把read_delim换成read_table;如果没有表头,记得加上col_names = FALSE或者手动指定列名

额外小提示

如果你的子目录结构更深(比如IsolatedData/00/subdirA),而你只想要最上层的子目录名(比如"00"),可以把提取子目录的代码改成:

subdirectory <- str_split(dirname(file_path), "/")[[1]][2]

内容的提问来源于stack exchange,提问作者HCAI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:46:00