R语言分组标记问题:存在值1则标记,否则标记最大值
分组标记flag的正确实现方法
需求说明
按group列分组处理数据,标记规则如下:
- 若分组内
col1存在值1,仅将该值所在行的flag设为"Y" - 若分组内
col1无值1,则将col1最大值所在行的flag设为"Y"
原数据
df <- data.frame( group = c("a", "a", "a", "a", "b", "b", "c", "c", "c", "c", "d", "d", "d"), col1 = c(-36,10,-5,1, 0, 5,10, 5, 20, 2, -1, 1, 2 ) )
原代码问题
原代码直接用case_when判断行级条件,没有先做分组级的逻辑判断,导致如果分组内同时存在1和非1的最大值时,会给两行都标记"Y",无法实现“满足第一个条件就不触发第二个条件”的要求:
df <- df %>% group_by(group) %>% mutate(flag = case_when( col1 == 1 ~ "Y", col1 == max(col1) ~ "Y", TRUE ~ "") )
正确实现代码
先在分组内判断是否存在值1,再基于这个分组级的条件做行级标记:
library(dplyr) df <- df %>% group_by(group) %>% mutate( # 先标记当前分组是否存在值1 has_one = any(col1 == 1), # 根据分组条件判断标记逻辑 flag = case_when( has_one & col1 == 1 ~ "Y", !has_one & col1 == max(col1) ~ "Y", TRUE ~ "" ) ) %>% select(-has_one) # 移除临时辅助列(可选)
预期输出
group col1 flag 1 a -36 2 a 10 3 a -5 4 a 1 Y 5 b 0 6 b 5 Y 7 c 10 8 c 5 9 c 20 Y 10 c 2 11 d -1 12 d 1 Y 13 d 2
内容的提问来源于stack exchange,提问作者karuno
相关产品推荐
相关产品推荐

