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
相关产品推荐
相关产品推荐

