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

如何合并行数不同的多份DataFrame/TXT文件的TPM列

用tidyverse合并多份带Gene_Id的TPM数据

核心思路

通过purrr批量读取并预处理文件,提取Gene_Id和TPM列并给TPM列赋予唯一标识,再用dplyr的连接函数按Gene_Id精准匹配合并,完全避免行错位问题。

具体步骤与代码

1. 加载依赖包

library(tidyverse)

2. 获取所有目标TXT文件路径

假设所有文件都存在当前工作目录的data子文件夹下,后缀为.txt:

txt_files <- list.files(path = "data", pattern = "\\.txt$", full.names = TRUE)

如果文件直接在当前目录,去掉path = "data"即可。

3. 批量读取并预处理数据

写一个自定义函数,读取单个文件后只保留关键列,同时给TPM列重命名为文件名(去掉后缀),避免列名重复:

process_single_file <- function(file_path) {
  # 提取文件名作为样本标识
  sample_label <- str_remove(basename(file_path), "\\.txt$")
  
  # 读取文件,仅保留Gene_Id和TPM列,并重命名TPM列
  read_delim(file_path, delim = "\t") %>%  # 假设是制表符分隔,根据实际修改delim
    select(Gene_Id, TPM) %>%
    rename(!!sample_label := TPM)
}

# 批量处理所有文件,得到数据框列表
df_collection <- map(txt_files, process_single_file)

提示:如果你的文件分隔符不是制表符,把delim换成对应符号(比如逗号",");如果TPM列名不是精确的TPM,替换成实际列名即可。

4. 按Gene_Id合并所有数据

用reduce结合full_join,逐个合并列表中的数据框,所有出现过的Gene_Id都会被保留,不存在的TPM值自动补NA:

merged_tpm_matrix <- df_collection %>%
  reduce(full_join, by = "Gene_Id")
  • 若只需要保留所有文件共有的Gene_Id,把full_join换成inner_join
  • 若想以第一个文件的Gene_Id为基准,用left_join

5. (可选)验证数据正确性

可以快速检查合并结果的维度,或随机抽查几个Gene_Id的匹配情况:

# 查看合并后的数据规模
dim(merged_tpm_matrix)

# 抽查特定Gene_Id的所有TPM值
merged_tpm_matrix %>% filter(Gene_Id == "ENSG00000130203")

关键注意事项

  • Gene_Id唯一性:每个输入文件中的Gene_Id必须唯一,否则合并会出现重复行。若存在重复,可在预处理时加distinct(Gene_Id, .keep_all = TRUE)去重
  • 列名唯一性:必须给每个TPM列赋予唯一标识(比如样本名),否则会因列名重复报错
  • 分隔符匹配:读取文件时务必使用正确的分隔符,否则会导致列错位

内容的提问来源于stack exchange,提问作者Desmodus1984

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:12:39