You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:09:17