基于唯一键对指定列求和(sum_distinct):R语言数据汇总问题
解决订单-配料交叉表的产品售出统计错误问题
问题核心是同一个订单的同一款产品会对应多行配料记录,直接按日期+产品分组统计会重复计数,导致结果偏差(比如周一咖啡实际售出3单,却统计成2单)。
正确实现步骤
- 先提取每个订单的唯一产品记录(去重订单ID+产品的组合),避免同一订单的多行配料被重复统计
- 再按日期+产品分组,统计售出数量
具体dplyr代码示例
假设你的数据包含order_id(订单ID)、date(日期)、product(产品)字段:
library(dplyr) # 第一步:去重,保留每个订单对应的唯一产品记录 unique_order_products <- cross_ingredient_product %>% distinct(order_id, date, product) # 第二步:分组统计售出数量 sales_summary <- unique_order_products %>% group_by(date, product) %>% summarise(total_sold = n(), .groups = "drop")
如果数据里有quantity字段(比如每个订单购买的产品数量),调整为:
sales_summary <- cross_ingredient_product %>% distinct(order_id, date, product, quantity, .keep_all = FALSE) %>% group_by(date, product) %>% summarise(total_sold = sum(quantity), .groups = "drop")
为什么sum(distinct(...))不行?
distinct()是用来筛选去重后的行,它不能直接作为sum()的参数——顺序完全搞反了。必须先对行去重,再对去重后的结果做求和/计数操作,而不是在求和函数里嵌套去重。
额外:配料消耗统计
如果需要同时汇总配料消耗(比如每种配料的总用量),可以单独处理:
ingredient_summary <- cross_ingredient_product %>% group_by(date, ingredient) %>% summarise(total_used = sum(ingredient_quantity), .groups = "drop")
内容的提问来源于stack exchange,提问作者Captain Tyler
相关产品推荐
相关产品推荐

