R语言按注释分组计算数据框每行对应分组的平均值
实现方案
下面提供两种可直接运行在你示例数据上的实现方式:
方法1:Base R 实现(无需额外安装依赖包)
# 构建分组与对应样本的映射关系 group_sample_map <- split(Annotation$Sample, Annotation$Group) # 按行遍历矩阵,计算每行在各分组下的均值 row_group_means <- t(apply(M, 1, function(row_vals) { sapply(group_sample_map, function(samples) mean(row_vals[samples])) })) # 转为数据框格式 result_df <- as.data.frame(row_group_means) # 如果需要将结果合并到原矩阵中,执行以下代码 M_with_means <- cbind(as.data.frame(M), result_df)
方法2:Tidyverse 实现(可读性高,便于后续拓展分析)
需提前安装加载dplyr、tidyr、tibble包:
library(dplyr) library(tidyr) library(tibble) result_df <- M %>% as.data.frame() %>% rownames_to_column("Gene") %>% pivot_longer(-Gene, names_to = "Sample", values_to = "Expression") %>% inner_join(Annotation, by = "Sample") %>% group_by(Gene, Group) %>% summarise(Group_mean = mean(Expression), .groups = "drop") %>% pivot_wider(names_from = "Group", values_from = "Group_mean") %>% column_to_rownames("Gene") # 合并到原矩阵 M_with_means <- cbind(as.data.frame(M), result_df)
两种方法输出的result_df即为每个基因对应各分组的平均值表,可按需直接使用。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

