如何使用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
相关产品推荐
相关产品推荐

