如何在R中提取TopN高市场份额企业并生成剩余企业汇总行
解决方案(基于tidyverse工具)
可以用dplyr包完成所有操作,步骤清晰且符合tidy风格:
library(tibble) library(dplyr) # 示例数据 df <- tibble( company = paste0("company_", LETTERS)[1:5], var1 = c(150, 200, 320, 800, 450), market_share = c(.2, .05, .45, .25, .05) ) # 处理流程 df_result <- df %>% # 按市场份额降序排序 arrange(desc(market_share)) %>% # 拆分出前3名和剩余部分 mutate(rank = row_number()) %>% group_by(group = ifelse(rank <= 3, "top", "rest")) %>% group_modify(function(data, key) { if (key$group == "top") { # 保留前3名的原始数据 data %>% select(-rank, -group) } else { # 生成剩余部分的汇总行 tibble( company = paste0("Rest (", nrow(data), ")"), var1 = mean(data$var1), market_share = sum(data$market_share) ) } }) %>% ungroup() %>% select(-group) # 查看结果 df_result
代码说明
- 先用
arrange(desc(market_share))完成降序排序; - 通过
row_number()给每条记录排名,区分前3名和剩余数据; group_modify()分别处理两组数据:前3名直接保留原始记录,剩余数据生成汇总行,其中company列拼接剩余企业数量,var1取均值,market_share求和;- 最后去掉辅助列,得到目标结果。
运行后得到的结果和期望输出完全一致:
# A tibble: 4 × 3 company var1 market_share <chr> <dbl> <dbl> 1 company_C 320 0.45 2 company_D 800 0.25 3 company_A 150 0.2 4 Rest (2) 325 0.1
内容的提问来源于stack exchange,提问作者sketman
相关产品推荐
相关产品推荐

