基于R/Tidyverse确定流式销售数据的起止日期及相关指标
解决客户维度销售数据聚合问题的方案
嘿,看来你在处理客户销售数据的聚合分析时遇到了小瓶颈,你猜的没错,dplyr的summarise函数确实是解决这个问题的关键工具之一,不过我们还需要搭配几个其他函数来精准提取你要的信息。我给你整理了一套完整的解决方案,结合示例数据来演示:
准备工作:加载依赖包与模拟数据
首先我们需要加载dplyr(用于数据操作)和lubridate(用于日期处理),同时模拟一份和你需求匹配的销售数据:
library(dplyr) library(lubridate) # 模拟包含客户ID、销售日期、销售额的示例数据 sales_data <- tibble( customer_id = rep(c("C001", "C002", "C003"), each = 5), sale_date = seq(as.Date("2023-01-05"), as.Date("2023-05-15"), by = "month") %>% rep(3), sales_amount = c(120, 150, 90, 200, 180, 80, 100, 130, 160, 110, 250, 220, 190, 210, 230) )
1. 计算每个客户最早/最晚销售日期及对应月份销售额
我们可以用slice_min和slice_max快速提取每个客户的最早、最晚销售记录,再结合floor_date提取对应的月份:
# 提取最早销售记录及对应月份销售额 earliest_sales <- sales_data %>% group_by(customer_id) %>% slice_min(sale_date, n = 1) %>% # 取每个客户最早的1条销售记录 mutate(sale_month = floor_date(sale_date, "month")) %>% # 将日期转换为当月第一天,统一月份格式 select(customer_id, earliest_sale_date = sale_date, earliest_month = sale_month, earliest_month_sales = sales_amount) # 提取最晚销售记录及对应月份销售额 latest_sales <- sales_data %>% group_by(customer_id) %>% slice_max(sale_date, n = 1) %>% mutate(sale_month = floor_date(sale_date, "month")) %>% select(customer_id, latest_sale_date = sale_date, latest_month = sale_month, latest_month_sales = sales_amount)
2. 计算每个客户销售额最高的月份及对应金额
这一步需要先按客户+月份聚合总销售额,再筛选出每个客户的最高销售额记录:
top_month_sales <- sales_data %>% mutate(sale_month = floor_date(sale_date, "month")) %>% group_by(customer_id, sale_month) %>% summarise(total_month_sales = sum(sales_amount), .groups = "drop_last") %>% # 按客户+月份计算总销售额 slice_max(total_month_sales, n = 1) %>% # 取每个客户销售额最高的月份 select(customer_id, top_sale_month = sale_month, top_month_sales = total_month_sales)
合并所有结果
最后把三个部分的结果合并成一个统一的数据集,方便查看和后续分析:
final_result <- earliest_sales %>% left_join(latest_sales, by = "customer_id") %>% left_join(top_month_sales, by = "customer_id") # 查看最终结果 print(final_result)
补充说明
- 如果存在多个月份销售额并列最高的情况,可以把
slice_max里的n = 1改成n = Inf,或者用filter(total_month_sales == max(total_month_sales))来保留所有最高记录; - 如果你的原始日期不是标准Date格式,记得先用
as.Date()或者lubridate的ymd()等函数转换为日期类型,避免计算错误。
内容的提问来源于stack exchange,提问作者Gulbas
相关产品推荐
相关产品推荐

