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

如何按总销售额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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:45:08