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)
数据样例
| Productnr | Type | Amount | COMPANY | Time |
|---|---|---|---|---|
| 1 | Apple | 29 | Company1 | 2003 |
| 1 | Pear | 271 | Company2 | 2004 |
| 3 | Apple | 565 | Company2 | 2001 |
| 2 | Banana | 354 | Company2 | 2006 |
| 2 | Pear | 984 | Company3 | 2003 |
| 1 | Banana | 247 | Company3 | 2000 |
| ... | ... | ... | ... | ... |
解决方案
原有代码仅筛选出了有苹果采购且采购量大于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_
相关产品推荐
相关产品推荐

