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

如何用dplyr删除零销售额占比超75%的品牌数据行?

修正dplyr品牌过滤逻辑的正确方法

我来帮你搞定这个数据过滤的问题,你之前的代码主要是没正确计算每个品牌的零销售额占比,咱们一步步调整:

首先明确需求:你要删除**零销售额周数占总周数比例超过75%**的品牌(或者说,保留正销售额周数占比≥25%的品牌)。如果总周数是固定的208,那也可以等价于保留正销售周数≥52周(208×25%)的品牌;如果是你提到的“正销售额周数至少156周”,那其实是要求零销售占比≤25%,这个咱们后面也会给出对应代码。

正确代码实现(按零销售占比过滤)

library(dplyr)

# 保留零销售额占比≤75%的品牌
Final_df_ <- Final_df %>%
  # 按品牌唯一标识符CBX分组
  group_by(CBX) %>%
  # 计算每个品牌的零销售额周数占比
  mutate(zero_sales_ratio = mean(Sales == 0)) %>%
  # 过滤掉占比超过75%的品牌
  filter(zero_sales_ratio <= 0.75) %>%
  # 取消分组,避免后续操作受分组影响
  ungroup() %>%
  # 移除临时计算的占比列(可选,不需要的话删掉)
  select(-zero_sales_ratio)

如果是要保留正销售周数≥156周的品牌

如果你的实际需求是保留正销售周数至少156周的品牌(也就是零销售周数≤52周,占比≤25%),可以用这个版本:

Final_df_ <- Final_df %>%
  group_by(CBX) %>%
  # 统计每个品牌的正销售周数
  mutate(positive_sales_count = sum(Sales > 0)) %>%
  # 保留满足条件的品牌
  filter(positive_sales_count >= 156) %>%
  ungroup() %>%
  select(-positive_sales_count)

你之前代码的问题说明

  1. 第一个代码filter(!any(Sales==0 & Price==0)):
    这个逻辑是只要品牌有一周出现零销售额且零价格,就删除整个品牌,这会过度过滤数据,因为它不考虑零销售的占比,只要存在一次就删掉。

  2. 第二个代码filter(!((Final_df$Sales==0)>0.75)):
    这里的逻辑完全错误——Sales==0是布尔值(TRUE/FALSE),和0.75比较时会被转成1/0,所以(Sales==0)>0.75等价于Sales==0,取反后就是只保留销售额不为0的行,根本不是按品牌整体占比来过滤。

额外注意事项

  • 分组时直接用group_by(CBX)即可,不要用group_by(Final_df$CBX),后者会生成一个命名奇怪的分组列,容易造成混乱。
  • 如果你判断“零销售额”的条件是Sales==0且Price==0(和你第一个代码一致),只需要把代码里的Sales == 0换成Sales == 0 & Price == 0就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:24