如何基于分组值格式化列?按规则筛选DataFrame分组类别
解决方案
可以使用dplyr包实现需求,核心逻辑是按名称分组后,优先保留Special类别;若无Special,则保留Number值最大的记录:
方法一:排序取首行
先给行设置优先级(Special优先级最高,其余按Number降序),再每组取第一行:
library(dplyr) # 处理数据 df_result <- df %>% group_by(Name) %>% # 排序规则:Special行排在最前,其余按Number从大到小排序 arrange(desc(Category == "Special"), desc(Number)) %>% # 提取每组第一行 slice_head(n = 1) %>% ungroup() # 查看结果 df_result
运行后输出结果:
# A tibble: 3 × 3 Name Category Number <chr> <chr> <int> 1 Name A Category 1 10 2 Name B Category 2 20 3 Name C Special 4
方法二:条件筛选
直接在分组内判断是否存在Special,针对性筛选目标行:
library(dplyr) df_result <- df %>% group_by(Name) %>% filter( # 组内有Special则筛选该行,否则筛选Number最大的行 if (any(Category == "Special")) Category == "Special" else Number == max(Number) ) %>% ungroup()
两种方法均可得到符合要求的结果,按需选择即可。
内容的提问来源于stack exchange,提问作者Ba Lalo
相关产品推荐
相关产品推荐

