R语言如何实现带特殊阈值规则的条件数据分组
问题修复方案
原有逻辑缺陷
原有基于2020年累计占比筛选保留车型的逻辑,未覆盖「单车型当年占比超过90%」的边界场景:该场景下头部车型排序第一时累计占比就已超过90%,会触发筛选条件无匹配值,最终所有车型全被归类为insignificant,不符合业务预期。
修复思路
先单独提取2020年的车型占比数据,优先判定是否存在单车型占比超90%的极端场景,分分支确定最终保留车型名单,再基于名单全量处理所有年份的车型归类,从根源避免边界场景异常:
- 若2020年存在单车型占比>90%:仅保留该车型作为有效分类
- 若不存在上述极端场景:沿用原有逻辑,保留2020年累计占比低于90%的车型
- 所有年份中不在保留名单内的车型,统一归类为
insignificant
可直接运行的实现代码
library(dplyr) # 替换为自身数据框中代表年度车型销量/销售额的实际字段名 sales_col <- "sales" # 第一步:基于2020年数据判定保留车型名单 keep_models <- df %>% filter(Year == 2020) %>% mutate(Share = .data[[sales_col]] / sum(.data[[sales_col]])) %>% { # 优先判定单车型占比超90%的极端场景 if (any(.$Share > 0.9)) { filter(., Share > 0.9) %>% pull(model) } else { # 无极端场景时走原有累计占比筛选逻辑 arrange(., desc(Share)) %>% mutate(CumulativeShare = cumsum(Share)) %>% filter(CumulativeShare < 0.9) %>% pull(model) } } # 第二步:全量数据归类输出 result <- df %>% group_by(Year) %>% mutate( Share = .data[[sales_col]] / sum(.data[[sales_col]]), model = if_else(model %in% keep_models, model, "insignificant") ) %>% # 若需要按归类后的车型重新聚合年度销量,保留以下代码;不需要可直接删除 group_by(Year, model) %>% summarise(across(all_of(sales_col), sum), .groups = "drop")
逻辑验证说明
- 正常场景(无单车型占比超90%)下,输出结果和原有逻辑完全一致,不会影响原有业务计算
- 极端场景下会自动保留占比超90%的头部车型,不会出现全量归为
insignificant的问题 - 所有非保留车型跨年份统一归类规则保持不变,符合业务要求
内容的提问来源于stack exchange,提问作者user18948933
相关产品推荐
相关产品推荐

