在R语言中按种群分组计算矩阵子组均值的方法咨询
在R中计算每个种群的样本均值
完全可以实现,以下是几种实用的方法,以示例数据为例:
1. 构造示例数据
先模拟一个符合你描述的矩阵,行名为sX-Y格式(X是种群编号,Y是样本编号):
set.seed(123) # 10个样本,3个特征的矩阵 mat <- matrix(rnorm(30), nrow=10, dimnames = list( c("s1-1", "s1-2", "s1-3", "s2-1", "s2-2", "s2-3", "s3-1", "s3-2", "s3-3", "s3-4"), paste0("feature", 1:3) ))
2. 提取种群分组信息
从行名中拆分出种群标识,这里用正则表达式提取-之前的部分:
# 提取种群分组,结果为c("s1","s1","s1","s2","s2","s2","s3","s3","s3","s3") groups <- sub("-.*", "", rownames(mat)) # 如果只需要数字编号,用这行:groups <- as.integer(sub("s(\\d+)-.*", "\\1", rownames(mat)))
3. 计算种群均值
方法一:基础R(tapply + apply)
适合习惯基础语法的用户,直接对矩阵操作:
# 按特征列计算每个种群的均值,转置后让行是种群,列是特征 pop_means <- t(apply(mat, 2, function(col_data) tapply(col_data, groups, mean)))
方法二:基础R(aggregate)
通过转成数据框实现,结果更易读:
# 转置矩阵(让样本列转成行),添加分组列 df <- cbind(t(mat), group = groups) # 按分组计算各特征均值 pop_means_agg <- aggregate(. ~ group, data = as.data.frame(df), mean) # 转成矩阵格式(可选) pop_means_agg <- as.matrix(pop_means_agg[, -1]) rownames(pop_means_agg) <- unique(groups)
方法三:tidyverse工具包(dplyr + tidyr)
适合数据处理流程化的场景:
library(dplyr) library(tidyr) pop_means_tidy <- mat %>% as.data.frame() %>% # 添加样本名和种群分组列 mutate(sample = rownames(.), group = sub("-.*", "", sample)) %>% select(-sample) %>% # 按分组聚合,计算每个特征的均值 group_by(group) %>% summarise(across(everything(), mean)) %>% # 把种群列设为行名,转成矩阵 column_to_rownames("group") %>% as.matrix()
最终得到的pop_means类对象,每行对应一个种群,每列对应特征的均值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Thend
相关产品推荐
相关产品推荐

