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

批量重命名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:05:58