如何基于独立元数据框按处理分组计算基因表达均值?
问题
我有一个基因表达数据框expr(行代表基因,列代表样本),还有一个记录样本元数据的meta数据框。实际数据中expr包含3万+行、100+列,以下是简化示例:
expr <- data.frame(sample1 = c(1,2,2,0,0), sample2 = c(5,2,4,4,0), sample3 = c(1,2,1,0,1), sample4 = c(6,5,6,6,7), sample5 = c(0,0,0,1,1)) rownames(expr) <- paste0("gene",1:5) meta <- data.frame(sample = paste0("sample",1:5), treatment = c("control","control", "treatment1", "treatment2", "treatment2"))
需要按处理分组计算每个基因的均值,分组信息在独立的meta数据框中,期望输出一个行为基因、列为处理、值为对应均值的数据框,格式如下:
# control treatment1 treatment2 # gene1 mean mean mean # gene2 mean mean mean
解决方案
方法一:tidyverse 流程
通过格式转换关联分组信息,计算后再转回目标格式:
library(tidyverse) expr_mean <- expr %>% rownames_to_column("gene") %>% # 将基因行名转为单独列 pivot_longer(cols = -gene, names_to = "sample", values_to = "expression") %>% # 转换为长格式 left_join(meta, by = "sample") %>% # 匹配分组信息 group_by(gene, treatment) %>% # 按基因+处理分组 summarise(mean_expr = mean(expression), .groups = "drop") %>% # 计算组内均值 pivot_wider(names_from = treatment, values_from = mean_expr) # 转回宽格式 # 恢复基因作为行名 rownames(expr_mean) <- expr_mean$gene expr_mean <- select(expr_mean, -gene)
方法二:Base R 方法(大数据量推荐)
直接基于原数据框操作,无需格式转换,效率更高:
# 按处理分组提取对应样本列名 sample_groups <- split(meta$sample, meta$treatment) # 对每个分组的样本列计算行均值,合并结果 expr_mean <- do.call(cbind, lapply(sample_groups, function(samples) { rowMeans(expr[, samples, drop = FALSE], na.rm = TRUE) }))
内容的提问来源于stack exchange,提问作者Kenn
相关产品推荐
相关产品推荐

