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

R语言分组标记全商品零销量门店异常记录方法

问题描述

现有一份统计多年度、多家门店、多品类商品销量的数据集,样例初始数据结构如下:

Initial_Data = data.frame(Year= c(2020, 2020, 2020, 2021, 2021, 2021, 2020, 2020, 2020, 2021, 2021, 2021,2020, 2020, 2020, 2021, 2021, 2021),
                     Stores = c('Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 3', 'Store 3', 'Store 3', 'Store 3', 'Store 3', 'Store 3'),
                     Items = c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
                     `Units Sold` = c(67, 32, 11, 0, 0, 0, 54, 0, 9, 71, 36, 12, 0, 0, 0, 45, 28, 7)
                     )

标记规则:

  • 仅当同一年度、同一门店下所有商品销量均为0时,将该组下所有记录标记为待核查
  • 仅单个/部分商品销量为0的场景无需标记,例如2020年Store 2的B商品销量为0,属于正常情况不需要标记

期望输出的结果结构参考:

Final_Data = data.frame(Year= c(2020, 2020, 2020, 2021, 2021, 2021, 2020, 2020, 2020, 2021, 2021, 2021,2020, 2020, 2020, 2021, 2021, 2021),
                     Stores = c('Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 1', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 2', 'Store 3', 'Store 3', 'Store 3', 'Store 3', 'Store 3', 'Store 3'),
                     Items = c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
                     `Units Sold` = c(67, 32, 11, 0, 0, 0, 54, 0, 9, 71, 36, 12, 0, 0, 0, 45, 28, 7),
                     Check = c('Fine', 'Fine', 'Fine', 'Check', 'Check', 'Check', 'Fine', 'Fine', 'Fine', 'Fine', 'Fine', 'Fine', 'Check', 'Check', 'Check', 'Fine', 'Fine', 'Fine')
                     )

要求方案通用,不硬编码适配样例,可直接支持数十家门店、10种以上商品、多年度的同类数据集。

通用实现方案

以下两种R实现均无需提前指定门店、商品、年度的具体枚举值,可直接适配任意规模的同结构数据集:

方案1:base R 原生实现(无第三方依赖)

核心逻辑是按Year+Stores分组,判断组内销量是否全为0,直接生成标记列:

# 生成分组唯一标识
group_id <- paste(Initial_Data$Year, Initial_Data$Stores, sep = "_")
# 计算每组销量是否全0(销量非负场景下,总销量为0等价于所有商品销量为0)
group_check <- tapply(Initial_Data$`Units Sold`, group_id, sum) == 0
# 匹配生成Check列
Initial_Data$Check <- ifelse(group_check[group_id], "Check", "Fine")

方案2:dplyr 实现(适配tidyverse工作流)

分组判断逻辑更直观,适合已经在使用tidyverse生态的场景:

library(dplyr)
Final_Data <- Initial_Data %>%
  group_by(Year, Stores) %>% # 按年度+门店维度分组
  mutate(Check = ifelse(sum(`Units Sold`) == 0, "Check", "Fine")) %>%
  ungroup()

注意:如果数据集存在销量为负的场景(比如退货扣减导致单条记录为负),请把判断逻辑从sum(\Units Sold`) == 0替换为all(`Units Sold` == 0)`,避免正负抵消出现误判。

效果验证

用样例数据运行上述代码后,标记结果完全匹配预期:

  • 2021年Store 1组总销量为0,3条记录全部标记为Check
  • 2020年Store 3组总销量为0,3条记录全部标记为Check
  • 其余分组总销量均大于0,即使存在单个商品销量为0的情况,全部标记为Fine,无误标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:33:25