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

R语言使用dplyr筛选每年均采购苹果的企业分组数据问题

问题描述

我持有如下业务数据,需实现对应需求:首先计算每家企业每年度各品类产品(例:苹果Apple)的采购量,该部分代码已编写完成。后续需要仅保留所有年份均有苹果采购记录的企业,剔除其余不符合要求的企业。
预期输出为:先按COMPANY(企业)、再按Type(品类)、最后按Time(年份)分组的数据集,包含每家企业各年度对应品类的采购量,仅保留每年均有采购行为的长期客户,便于观测其采购规律。
我原本尝试通过filter函数完成筛选,但运行后返回结果仍包含非长期客户,未找到可行解决方案。

现有代码
MASTERDATA %>%
  group_by(COMPANY,Type,Time)%>% 
  summarize(Amount_COMPANY = (sum(Amount, na.rm=TRUE)))%>%
  filter(Type=="Apple",Amount_COMPANY>0)
数据样例
ProductnrTypeAmountCOMPANYTime
1Apple29Company12003
1Pear271Company22004
3Apple565Company22001
2Banana354Company22006
2Pear984Company32003
1Banana247Company32000
...............
解决方案

原有代码仅筛选出了有苹果采购且采购量大于0的记录,没有验证企业的苹果采购记录是否覆盖了所有年份,因此无法实现长期客户的筛选需求,修正后的代码如下:

# 第一步:统计数据集覆盖的总年份数量,若你有指定的年份范围可直接手动赋值
total_years <- n_distinct(MASTERDATA$Time)

result <- MASTERDATA %>%
  # 按企业、品类、年份聚合采购量
  group_by(COMPANY, Type, Time) %>%
  summarize(Amount_COMPANY = sum(Amount, na.rm = TRUE), .groups = "drop") %>%
  # 仅保留所有年份都有苹果采购的企业的记录
  semi_join(
    # 筛选出符合要求的企业列表
    . %>%
      filter(Type == "Apple", Amount_COMPANY > 0) %>%
      group_by(COMPANY) %>%
      summarize(apple_purchase_years = n_distinct(Time), .groups = "drop") %>%
      filter(apple_purchase_years == total_years),
    by = "COMPANY"
  ) %>%
  # 按要求的维度排序
  arrange(COMPANY, Type, Time)

补充说明

  • 若你仅需要保留苹果品类的采购数据,可在semi_join步骤后补充filter(Type == "Apple")
  • 若你对"全年份"的定义不是数据集覆盖的所有年份,而是指定的连续N年,可直接修改total_years的赋值为对应数值即可
  • 若要求企业除了苹果之外的其他品类也需要每年都有采购,可调整semi_join内的filter条件,去掉Type == "Apple"的限制即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:36:02