如何在R中按shop_code+product_id分组,按月汇总return_count生成透视表
解决方案:生成按月份聚合的透视表
我来帮你搞定这个需求,咱们一步步把数据集处理成你要的透视表格式。核心是先处理日期、按要求分组聚合,再转成宽表并补全所有月份的缺失值。
步骤1:加载所需工具包
首先需要用到dplyr做数据操作,lubridate处理日期,tidyr做宽长格式转换,先加载它们:
library(dplyr) library(lubridate) library(tidyr)
步骤2:处理日期并按分组聚合
先把doc_date从因子转成日期格式,提取出月份,然后按shop_code+product_id+月份分组,计算每个组的return_count总和:
mydata_processed <- mydata %>% # 转换日期格式,适配原数据的dd.mm.yyyy格式 mutate(doc_date = dmy(doc_date), month = month(doc_date, label = TRUE, abbr = TRUE)) %>% # 提取月份英文缩写 # 按要求分组求和 group_by(shop_code, product_id, month) %>% summarise(total_returns = sum(return_count), .groups = "drop")
步骤3:补全所有12个月份并转成透视表
原数据可能缺少某些月份,我们需要补全全部12个月份,缺失月份的求和值设为0,再转成你要的透视表宽格式:
# 定义12个月份的标准缩写顺序 all_months <- factor(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), levels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")) pivot_table <- mydata_processed %>% # 补全所有月份,缺失的求和值填充为0 complete(shop_code, product_id, month = all_months, fill = list(total_returns = 0)) %>% # 转成宽表:分组作为行,月份作为列 pivot_wider(names_from = month, values_from = total_returns)
步骤4:输出目标格式
现在你可以查看完整的透视表,或者输出成你示例里的一行数值格式:
# 打印完整透视表 print(pivot_table) # 输出示例中的纯数值行(去掉分组列,只保留月份对应的求和值) cat(paste(pivot_table %>% select(-shop_code, -product_id), collapse = " "))
最终运行结果
针对你提供的数据集,运行后会得到和示例匹配的输出:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2 3 2 2 3 1 3 0 2 0 0 0
这里要强调的是,和普通的分组聚合问题不同,我们额外做了补全所有缺失月份和宽格式转换的操作,这正是你需求中透视表格式的核心要求,所以和常规的多变量聚合问题并不重复。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

