在R中读取不同文件夹下的.tsv文件并添加文件夹名列
嘿,这个批量处理的需求我太熟了!395个文件夹手动加列绝对是噩梦,下面给你两种方案,都能自动把文件夹名称加到数据框里,一步到位合并所有文件:
方案一:用tidyverse工具链(推荐,简洁高效)
tidyverse里的readr和purrr包能帮你快速完成读取、添加列、合并的全流程:
# 先安装并加载tidyverse(如果还没装的话) if (!require("tidyverse")) install.packages("tidyverse") library(tidyverse) # 1. 获取所有file.tsv的完整路径 file_paths <- list.files( path = "A:/output", pattern = "^file\\.tsv$", # 精确匹配文件名,避免误抓类似file1.tsv的文件 recursive = TRUE, # 递归遍历所有子文件夹 full.names = TRUE # 返回完整文件路径(而非仅文件名) ) # 2. 批量读取文件,自动添加folder列并合并 combined_df <- map_dfr(file_paths, function(file_path) { # 从路径中提取文件夹名称:取路径的倒数第二部分 folder_name <- basename(dirname(file_path)) # 读取tsv文件,然后新增folder列 read_tsv(file_path) %>% mutate(folder = folder_name) }) # 查看合并后的结果 head(combined_df)
方案说明
map_dfr()会自动把每个文件生成的小数据框按行合并,省去手动rbind的麻烦basename(dirname(file_path))是提取文件夹名的关键:dirname()先得到文件所在的文件夹路径(比如A:/output/Folder1),basename()再提取路径的最后一段,就是你要的Folder1read_tsv()比base R的read.table更快,且默认不会把字符串转成因子,处理数据更省心
方案二:Base R实现(无需额外安装包)
如果你不想装新包,用base R也能完成:
# 1. 获取所有file.tsv的完整路径 file_paths <- list.files( path = "A:/output", pattern = "^file\\.tsv$", recursive = TRUE, full.names = TRUE ) # 2. 初始化空列表,用来存储每个文件的数据框 df_list <- list() # 3. 遍历每个文件,读取并添加folder列 for (i in seq_along(file_paths)) { current_path <- file_paths[i] # 提取文件夹名称 folder_name <- basename(dirname(current_path)) # 读取tsv文件(注意sep="\t"指定分隔符,header=TRUE表示第一行是列名) current_df <- read.table( current_path, sep = "\t", header = TRUE, stringsAsFactors = FALSE ) # 添加folder列 current_df$folder <- folder_name # 把当前数据框加入列表 df_list[[i]] <- current_df } # 4. 合并所有数据框 combined_df <- do.call(rbind, df_list) # 查看结果 head(combined_df)
关键细节提醒
- 文件格式一致性:确保所有
file.tsv的列名、列数和数据类型一致,否则合并时可能报错。如果有格式不一致的文件,可以在读取时用col_types(tidyverse)或colClasses(base R)统一指定列类型 - 路径匹配准确性:
pattern = "^file\\.tsv$"是正则表达式,确保只匹配文件名恰好是file.tsv的文件,避免匹配到类似file_backup.tsv的文件 - 大文件处理:如果单个文件很大,推荐用
read_tsv,它的内存效率更高,处理速度更快
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

