在R语言中按唯一行名分组计算各列均值的实现方法
在R语言中按唯一行名分组计算各列均值的实现方法
嘿,我先提个小细节:你给出的矩阵代码里存在元素数量、行列数不匹配的问题(10行6列需要60个元素,但你只写了9个,列名也只有3个),我先帮你调整成符合你示例输出的合理测试数据,再给你两种实用的实现方法~
第一步:修正测试数据
先构建和你预期输出匹配的矩阵(包含重复行名,方便分组计算):
# 创建包含重复行名的测试矩阵 A <- matrix(c(5,4,2, 5,4,2, # 行名"2.4"的两组数据 2,3,3, 2,3,3, # 行名"4.5"的两组数据 4,2,4, 4,2,4), # 行名"8.5"的两组数据 nrow = 6, ncol = 3, byrow = TRUE) rownames(A) <- c("2.4", "2.4", "4.5", "4.5", "8.5", "8.5") colnames(A) <- c("X1", "X2", "X3")
方法一:使用Base R原生函数(无需额外安装包)
Base R的aggregate()函数就能轻松搞定分组均值计算,步骤如下:
# 1. 将矩阵转换为数据框 df <- as.data.frame(A) # 2. 添加行名列作为分组依据 df$group <- rownames(df) # 3. 按group分组,计算所有列的均值 result <- aggregate(. ~ group, data = df, FUN = mean) # 4. 整理成你想要的格式(行名为分组值,删除多余列) rownames(result) <- result$group result$group <- NULL print(result)
运行后就能得到你想要的输出:
X1 X2 X3 2.4 5 4 2 4.5 2 3 3 8.5 4 2 4
方法二:使用dplyr包(代码更简洁)
如果你习惯tidyverse风格的代码,用dplyr会更直观,先确保你安装了这个包:
# 如果未安装dplyr,先运行这行 # install.packages("dplyr") library(dplyr) result <- as.data.frame(A) %>% # 添加行名列作为分组键 mutate(group = rownames(.)) %>% # 按group分组 group_by(group) %>% # 计算所有列的均值 summarise(across(everything(), mean)) %>% # 将分组列转换为行名 column_to_rownames(var = "group") print(result)
这个方法用管道操作串联所有步骤,代码更紧凑,结果和方法一完全一致。
备注:内容来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

