如何按总销售额90%的比例筛选R语言dataframe?
筛选贡献90%总销售额的行
嘿,我懂你想要的是找出那些贡献了90%总销售额的头部记录,之前用quantile(Sales, 0.9)踩坑很正常——因为这个函数是按行数的比例来取分位数,根本不是按销售额的累计占比计算的,所以才只返回了一行,完全不是你要的结果😅
你的思路方向完全正确,我们可以把这个流程用更简洁的代码实现,不管是用tidyverse风格的dplyr还是纯base R都可以:
方法1:用dplyr(推荐,代码更易读维护)
先加载dplyr包,然后通过管道操作一步完成排序、计算占比、筛选:
library(dplyr) # 生成目标数据集 top_90_sales <- df %>% arrange(desc(Sales)) %>% # 按销售额从高到低排序 mutate( sales_pct = Sales / sum(Sales), # 单条记录的销售额占总销售额比例 cum_pct = cumsum(sales_pct) # 计算累计占比 ) %>% # 筛选累计占比≤90%的行;如果需要包含刚好跨越90%阈值的那一行,改成cum_pct <= 0.9 | lag(cum_pct) < 0.9 filter(cum_pct <= 0.9) %>% select(-sales_pct, -cum_pct) # 可选:移除中间计算用的列
方法2:纯base R实现(无需额外包)
如果你不想加载第三方包,用base R也能轻松完成:
# 先按销售额降序排序 df_sorted <- df[order(-df$Sales), ] # 计算累计销售额占总销售额的比例 df_sorted$cum_pct <- cumsum(df_sorted$Sales) / sum(df_sorted$Sales) # 筛选累计占比≤90%的行 top_90_sales <- df_sorted[df_sorted$cum_pct <= 0.9, ] # 可选:删除临时计算的cum_pct列 top_90_sales$cum_pct <- NULL
用你的样本数据验证一下
你的样本总销售额是214108 + 207858 + 76548 + 68361 + 56456 = 623331,90%的目标销售额是623331 * 0.9 = 560997.9:
- 前2行总和:
421966,未达90% - 前3行总和:
498514,仍未达 - 前4行总和:
566875,超过阈值
如果需要确保总销售额刚好覆盖90%,把筛选条件改成cum_pct <= 0.9 | lag(cum_pct) < 0.9,就能自动把那行“跨越阈值”的记录也包含进来啦。
内容的提问来源于stack exchange,提问作者Rnovice
相关产品推荐
相关产品推荐

