R语言合并多txt文件为数据框并按文件名重命名raw_counts列
基因定量文件批量合并修正方案
你原有代码的核心问题是未在单文件读取阶段完成列筛选、列重命名就直接合并,导致同名列自动追加.x/.y后缀,后续替换不仅繁琐还容易出错。最优方案是把列处理、重命名操作前置到读取单文件的步骤中,从根源避免列名冲突,实现代码如下:
完整可运行代码
library(tidyverse) # 配置文件存储路径 file_path <- "/Target_Data/TARGET_FHCRC/" # 匹配目标定量文件 all_files <- dir(file_path) target_files <- grep(all_files, pattern = "^T.*gene.quantification.txt$", value = TRUE) # 批量读取文件,同步完成列筛选、列重命名 df_list <- map2( .x = target_files, # 提取样本ID:删除文件名末尾固定的.gene.quantification.txt后缀 .y = str_remove(target_files, "\\.gene\\.quantification\\.txt$"), .f = ~{ # 读取单个定量文件 single_df <- read.delim( file = file.path(file_path, .x), stringsAsFactors = FALSE, check.names = FALSE, row.names = NULL ) # 仅保留gene、raw_counts两列,直接丢弃不需要的RPKM、median_length_normalized列 single_df <- single_df[, c("gene", "raw_counts")] # 重命名raw_counts列为带样本ID的唯一列名 colnames(single_df)[2] <- paste0("raw_counts_", .y) return(single_df) } ) # 按共有gene列合并所有样本,无列名冲突问题 merge_result <- df_list %>% reduce(inner_join, by = "gene")
关键逻辑说明
- 列裁剪前置:单文件读取时就丢弃不需要的两列指标,相比合并后再删列更省内存,也不会产生多余的重名列
- 样本ID提取:通过正则直接删除固定后缀得到样本ID,适配所有符合命名规则的定量文件,不会出现ID提取错误
- 列重命名前置:每个文件的count列在合并前就设置为唯一列名,合并时不会触发R自动加
.x/.y后缀的机制,完全不需要后续用正则批量替换后缀,避免替换失误 - 路径拼接:用
file.path()拼接文件目录和文件名,避免因为工作路径设置不对导致的文件读取失败问题
扩展调整
- 如果需要保留所有文件中出现的基因(而非仅保留所有样本共有的基因),将合并步骤的
inner_join替换为full_join即可 - 如果需要按样本顺序排列列,可以在合并完成后通过列名排序调整顺序
内容的提问来源于stack exchange,提问作者Mohammed Toufiq
相关产品推荐
相关产品推荐

