如何合并行数不同的多份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
相关产品推荐
相关产品推荐

