请求编写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
相关产品推荐
相关产品推荐

