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

如何使用dplyr的mutate()按指定条件对列值分组求平均?

解决方案:用dplyr实现指定测试组的error对应行均值计算

核心思路

要实现Test 1和Test 2对应行的error值平均,同时保留原数据行数,关键是给每个受试者(name)下的Test 1、Test 2行添加匹配序号,再按序号分组计算均值,Test 3的error值直接保留。

代码实现

首先加载dplyr包:

library(dplyr)

对数据集进行处理:

dat_processed <- dat %>%
  # 给每个受试者的每类测试行编序号,用于匹配Test 1和Test 2的对应行
  group_by(name, test) %>%
  mutate(row_idx = row_number()) %>%
  ungroup() %>%
  # 按受试者和行序号分组,计算对应行的均值
  group_by(name, row_idx) %>%
  mutate(
    error_avg = case_when(
      # Test 1和Test 2取组内两者的error均值
      test %in% c("Test 1", "Test 2") ~ mean(error[test %in% c("Test 1", "Test 2")], na.rm = TRUE),
      # Test 3直接保留原error值
      TRUE ~ error
    )
  ) %>%
  ungroup() %>%
  # 移除临时的序号列(可选,根据需求保留)
  select(-row_idx)

关键步骤说明

  • 添加匹配序号:通过group_by(name, test) %>% mutate(row_idx = row_number()),给每个受试者的每类测试行分配连续序号,确保Test 1的第n行和Test 2的第n行序号一致,实现对应行的精准匹配。
  • 分组计算均值:按name和row_idx分组后,同一组包含Test 1和Test 2的对应行,用case_when()判断测试类型,对Test 1/Test 2的error取组内均值,Test 3直接沿用原数值。
  • 保留原行数:整个过程没有删减行,最终输出的行数和原数据完全一致。

结果验证

可以查看处理后的数据示例,比如筛选Person 1的前6行:

dat_processed %>%
  filter(name == "Person 1") %>%
  slice(1:6)

输出中Test 1和Test 2的对应行error_avg会是两者的均值,比如第1行和第4行的error_avg为(14.9 + 9.5)/2 = 12.2,第2行和第5行的error_avg为(8.4 + 3)/2 = 5.7,符合需求。

内容的提问来源于stack exchange,提问作者user13973103

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:43:11