批量重命名RNA-seq文件列并合并总表的R/Python实现求助
批量处理RSEM基因表达文件并合并的三种实现方案
你需要批量处理近1000个RSEM输出的*.genes.results文件,重命名指定列并按gene_id合并为总表,以下是三种高效实现方案:
R 实现(data.table 版,适合大数据量)
data.table在处理大文件和批量操作时效率远高于基础R或tidyverse,适配1000个样本的场景:
library(data.table) # 1. 获取所有目标文件路径 file_list <- list.files(path = "./", pattern = "\\.genes\\.results$", full.names = TRUE) # 2. 定义单个文件处理函数 process_file <- function(file_path) { # 读取文件,保留表头 dt <- fread(file_path, header = TRUE) # 提取样本ID:从文件名中移除后缀,如"01_123456_.genes.results" → "01_123456_" sample_id <- sub("\\.genes\\.results$", "", basename(file_path)) # 重命名目标列,仅保留gene_id和重命名后的表达列 setnames(dt, old = c("expected_count", "TPM", "FPKM"), new = paste(sample_id, c("expected_count", "TPM", "FPKM"), sep = "_")) return(dt[, .(gene_id, paste(sample_id, c("expected_count", "TPM", "FPKM"), sep = "_")), with = FALSE]) } # 3. 批量处理所有文件 processed_dts <- lapply(file_list, process_file) # 4. 按gene_id合并所有表(若所有文件gene_id顺序完全一致,可改用cbind提速) merged_dt <- Reduce(function(x, y) merge(x, y, by = "gene_id", all = TRUE), processed_dts) # 5. 保存结果 fwrite(merged_dt, "./merged_gene_expression.csv", sep = "\t")
若确认所有文件的gene_id顺序完全一致,可替换合并步骤为更高效的列绑定:
gene_col <- processed_dts[[1]][, .(gene_id)] expr_cols <- lapply(processed_dts, function(dt) dt[, -"gene_id"]) merged_dt <- cbind(gene_col, do.call(cbind, expr_cols))
Python 实现(pandas 版)
适合熟悉Python生态的用户,pandas的批量处理可轻松应对1000个样本规模:
import pandas as pd import os # 1. 获取所有目标文件 file_list = [f for f in os.listdir("./") if f.endswith(".genes.results")] # 2. 初始化合并表 merged_df = None # 3. 循环处理每个文件 for file in file_list: # 读取文件,跳过数字序号行名 df = pd.read_csv(file, sep="\t", index_col=False) # 提取样本ID sample_id = os.path.splitext(file)[0] # 重命名表达列 df.rename(columns={ "expected_count": f"{sample_id}_expected_count", "TPM": f"{sample_id}_TPM", "FPKM": f"{sample_id}_FPKM" }, inplace=True) # 仅保留需要的列 df = df[["gene_id", f"{sample_id}_expected_count", f"{sample_id}_TPM", f"{sample_id}_FPKM"]] # 合并到总表 merged_df = df if merged_df is None else pd.merge(merged_df, df, on="gene_id", how="outer") # 4. 保存结果 merged_df.to_csv("./merged_gene_expression.csv", sep="\t", index=False)
命令行实现(awk 版,无需编程环境)
适合无R/Python环境的场景,awk处理速度极快,直接在终端执行:
# 1. 提取第一个文件的gene_id列作为基础 head -n 1 *.genes.results | grep -v "^$" | cut -f1 > merged_table.txt # 2. 循环处理每个文件,提取并修改列名和数据 for file in *.genes.results; do sample_id=$(echo "$file" | sed 's/\.genes\.results$//') # 提取并修改表头 head -n 1 "$file" | awk -v id="$sample_id" '{print id"_"$5, id"_"$6, id"_"$7}' >> header_temp.txt # 提取数据行(跳过表头) tail -n +2 "$file" | cut -f5,6,7 >> data_temp.txt done # 3. 合并表头、gene_id和数据 paste <(cat merged_table.txt) <(paste -d'\t' header_temp.txt) <(paste -d'\t' data_temp.txt) > merged_gene_expression.txt # 4. 清理临时文件 rm merged_table.txt header_temp.txt data_temp.txt
注意事项
- 若不同文件的
gene_id集合不一致,可通过all=TRUE(R)或how="outer"(Python)保留所有基因 - 处理超大规模文件时,优先选择data.table或awk方案,内存占用更低
- 样本ID提取规则可根据实际文件名调整,例如若文件名是
01_123456_.genes.results,可改用sed 's/_\.genes\.results$//'移除末尾下划线
内容的提问来源于stack exchange,提问作者stratocaster
相关产品推荐
相关产品推荐

