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

请求编写R语言代码:按年份筛选销量Top2产品并将其余产品归为‘other’类

R实现按年份提取销量Top2产品并汇总其余为'other'

我来帮你搞定这个需求!针对你提供的按年份和产品维度划分的销售数据,我们可以用R语言结合dplyr包轻松实现目标:按年份识别销量排名前2的产品,将其余产品统一归类为other类别。

首先先确认你的示例数据(我把代码整理好了):

# 示例销售数据
Year <- c(2010,2010,2010,2010,2010,2011,2011,2011,2011,2011,2012,2012,2012,2012,2012)
Model <- c("a","b","c","d","e","a","b","c","d","e","a","b","c","d","e")
Sale <- c("30","45","23","33","24","11","56","19","45","56","33","32","89","33","12")
df <- data.frame(Year, Model, Sale)

注意事项

你提供的Sale列是字符类型,直接用来排序会出错,所以第一步要把它转成数值型。接下来用dplyr的分组、排名功能来处理:

完整解决方案代码

# 如果没安装dplyr包,先运行这行:install.packages("dplyr")
library(dplyr)

# 1. 将Sale列转换为数值型,确保排序准确
df <- df %>%
  mutate(Sale = as.numeric(Sale))

# 2. 按年份分组,计算每个产品的销量排名,替换非Top2产品为'other'
df_processed <- df %>%
  group_by(Year) %>%
  # 按销量降序排名,dense_rank处理并列情况(比如同销量的产品都算Top2)
  mutate(rank = dense_rank(desc(Sale))) %>%
  # 把排名超过2的产品归类为'other'
  mutate(Model = ifelse(rank > 2, "other", Model)) %>%
  ungroup() %>%  # 取消分组状态
  select(-rank)  # 移除排名列(可选,根据需求保留)

# 3. 可选:按年份和新的Model汇总总销量
df_summary <- df_processed %>%
  group_by(Year, Model) %>%
  summarise(Total_Sale = sum(Sale), .groups = "drop")

# 查看最终汇总结果
print(df_summary)

代码说明

  • dense_rank(desc(Sale)):这里用dense_rank而不是普通的rank,是为了处理并列销量的情况——比如2011年有两个产品销量都是56,它们都会被判定为Top2,不会出现跳号的情况。如果你的需求是严格取前2个不同的销量值,可以换成rank。
  • 最后一步的汇总操作是可选的,如果只需要标记出Top2和other,不需要汇总的话,直接用df_processed即可。

内容的提问来源于stack exchange,提问作者Underwood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:33:15