在R语言中按多条件分组获取BRR字段的最大值
按规则计算分组BRR最大值
原始数据
首先创建目标数据框:
ID <- c('A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A' ) BRR <- c(62,57,66,53,54,50,55,65,71,53,51,50,58,54,55,57) val1 <- c(1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3) val2 <- c(0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2) df <- data.frame(ID, BRR, val1, val2)
数据框输出结果:
ID BRR val1 val2 1 A 62 1 0 2 A 57 1 0 3 A 66 1 0 4 A 53 1 0 5 A 54 1 0 6 A 50 1 0 7 A 55 1 0 8 A 65 2 1 9 A 71 2 1 10 A 53 2 1 11 A 51 3 2 12 A 50 3 2 13 A 58 3 2 14 A 54 3 2 15 A 55 3 2 16 A 57 3 2
需求说明
需要新增一列max_val_KP,规则如下:
- 当
val2 = 0时,max_val_KP赋值为0 - 当
val2 ≠ 0时,取当前行所在ID + val1分组的BRR最大值 - 数据中
val2始终比同组的val1小1
错误代码分析
你尝试的两段代码存在逻辑问题:
- 第一段代码中
filter(va1 == val2)存在拼写错误(va1应为val1),且数据中val2始终比val1小1,该过滤条件永远不成立,最终会得到空数据框。 - 第二段代码按
ID, val1 == val2分组,由于所有行的val1都不等于val2,最终只会生成一个分组,计算出的是整个数据的BRR最大值,不符合分组需求。
正确解决方案
使用dplyr按以下步骤实现:
- 按
ID和val1分组,计算每组的BRR最大值 - 根据
val2的值判断赋值:val2=0时设为0,否则用分组最大值 - 清理临时列,得到最终结果
代码如下:
library(dplyr) df_result <- df %>% # 按ID和val1分组,计算每组BRR最大值 group_by(ID, val1) %>% mutate(group_max = max(BRR)) %>% ungroup() %>% # 根据val2规则赋值max_val_KP mutate(max_val_KP = ifelse(val2 == 0, 0, group_max)) %>% # 移除临时计算列 select(-group_max)
最终输出结果:
ID BRR val1 val2 max_val_KP 1 A 62 1 0 0 2 A 57 1 0 0 3 A 66 1 0 0 4 A 53 1 0 0 5 A 54 1 0 0 6 A 50 1 0 0 7 A 55 1 0 0 8 A 65 2 1 71 9 A 71 2 1 71 10 A 53 2 1 71 11 A 51 3 2 58 12 A 50 3 2 58 13 A 58 3 2 58 14 A 54 3 2 58 15 A 55 3 2 58 16 A 57 3 2 58
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

