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

如何基于独立元数据框按处理分组计算基因表达均值?

问题

我有一个基因表达数据框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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:03:20