如何结合group_by与mutate计算指定列的分组均值?
问题:按性别-表型分组计算指定脑区数据的均值
原始数据与需求
数据框定义
Sex <- c("F", "F", "M", "M", "F") Phenotype <- c(Control, Experimental, Experimental, Control, Control) MOp_Amygdala <- c("10", "15", "2", "6", "8") MOp_Thalamus <- c("19", "12", "4", "4", "6") MOp_Cerebellum <- c("34", "45", "67", "78", "99") MOq_Cortex <- c("2", "5", "6", "17", "2") MOq_Striatum <- c("100", "101", "102", "106", "200") df <- data.frame(Sex, Phenotype, MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum, MOq_Cortex, MOq_Striatum)
需求
获取M-Control、M-Experimental、F-Control、F-Experimental四组中,MOp_Amygdala、MOp_Thalamus、MOp_Cerebellum的均值。
尝试的错误代码
Q1 <- data %>% group_by(Sex, Phenotype)%>% select(starts_with("MOp")) %>% rowwise() %>% mutate(Group_Means = mean(c(MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum))) #redundant
问题现象
group_by未生效,本该得到4条分组结果,却输出了5条(每个样本一条)。
错误原因
- 变量名不匹配:代码中用
data指代数据框,但实际数据框名为df; rowwise()破坏分组逻辑:该函数强制按行处理数据,覆盖了group_by()的分组汇总效果,导致每个样本单独计算;mutate()的使用场景错误:mutate()是为每行添加新列,不会压缩行数,分组汇总应该用summarise();- 数值列类型错误:原始数据中数值列被定义为字符型(加了引号),无法直接计算均值。
修正后的解决方案
第一步:修正原始数据定义
先把Phenotype改为字符串,同时去掉数值列的引号,确保数据类型正确:
Sex <- c("F", "F", "M", "M", "F") Phenotype <- c("Control", "Experimental", "Experimental", "Control", "Control") MOp_Amygdala <- c(10, 15, 2, 6, 8) MOp_Thalamus <- c(19, 12, 4, 4, 6) MOp_Cerebellum <- c(34, 45, 67, 78, 99) MOq_Cortex <- c(2, 5, 6, 17, 2) MOq_Striatum <- c(100, 101, 102, 106, 200) df <- data.frame(Sex, Phenotype, MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum, MOq_Cortex, MOq_Striatum)
方案1:按分组计算每个脑区的单独均值
如果需要每组中三个脑区各自的均值,用以下代码:
library(dplyr) grouped_region_means <- df %>% group_by(Sex, Phenotype) %>% summarise( MOp_Amygdala_mean = mean(MOp_Amygdala), MOp_Thalamus_mean = mean(MOp_Thalamus), MOp_Cerebellum_mean = mean(MOp_Cerebellum), .groups = "drop" # 取消分组,返回普通数据框 ) print(grouped_region_means)
输出示例:
# A tibble: 4 × 4 Sex Phenotype MOp_Amygdala_mean MOp_Thalamus_mean MOp_Cerebellum_mean <chr> <chr> <dbl> <dbl> <dbl> 1 F Control 9 12.5 66.5 2 F Experimental 15 12 45 3 M Control 6 4 78 4 M Experimental 2 4 67
方案2:按分组计算三个脑区的整体均值
如果需要每组中所有脑区数据的整体均值,用以下代码:
# 方法1:直接计算 grouped_overall_mean <- df %>% group_by(Sex, Phenotype) %>% summarise( MOp_overall_mean = mean(c(MOp_Amygdala, MOp_Thalamus, MOp_Cerebellum)), .groups = "drop" ) # 方法2:转为长格式后计算(更规范,适合扩展更多列) grouped_overall_mean <- df %>% select(Sex, Phenotype, starts_with("MOp")) %>% pivot_longer(cols = starts_with("MOp"), names_to = "Region", values_to = "Value") %>% group_by(Sex, Phenotype) %>% summarise(MOp_overall_mean = mean(Value), .groups = "drop") print(grouped_overall_mean)
输出示例:
# A tibble: 4 × 3 Sex Phenotype MOp_overall_mean <chr> <chr> <dbl> 1 F Control 29.3 2 F Experimental 24 3 M Control 29.3 4 M Experimental 24.3
内容的提问来源于stack exchange,提问作者Adriana
相关产品推荐
相关产品推荐

