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

如何结合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条(每个样本一条)。


错误原因

  1. 变量名不匹配:代码中用data指代数据框,但实际数据框名为df;
  2. rowwise()破坏分组逻辑:该函数强制按行处理数据,覆盖了group_by()的分组汇总效果,导致每个样本单独计算;
  3. mutate()的使用场景错误:mutate()是为每行添加新列,不会压缩行数,分组汇总应该用summarise();
  4. 数值列类型错误:原始数据中数值列被定义为字符型(加了引号),无法直接计算均值。

修正后的解决方案

第一步:修正原始数据定义

先把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:25:22