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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:10:30