如何用Purrr map()函数批量按自定义日期区间处理销售数据
解决方案:用Purrr批量迭代日期区间的销售数据汇总
核心思路
利用purrr::map2()同时遍历起始/结束日期对,对每一组区间执行数据过滤+自定义汇总,同时兼容缺失/重复数据、支持自定义区间间隔与汇总逻辑。
步骤1:准备数据(替换为你的真实数据即可)
先构造贴合真实场景的示例数据,包含重复日期、缺失日期记录:
library(dplyr) library(lubridate) library(purrr) # 模拟带重复、缺失值的销售数据 set.seed(123) sold_data <- tibble( sale_date = sample(seq(as.Date("2020-01-01"), as.Date("2023-12-31"), by = "day"), 1000, replace = TRUE), amount = runif(1000, 100, 1000), product_id = sample(1:10, 1000, replace = TRUE) ) %>% add_row(sale_date = NA, amount = 500, product_id = 3) %>% # 缺失日期记录 bind_rows(slice(., 1:5)) # 重复交易记录
步骤2:生成自定义间隔的日期区间(已有start/end向量可跳过)
写一个参数化函数,支持生成任意月数间隔的起止日期对:
# 生成自定义间隔的日期区间 generate_date_intervals <- function(start_date, end_date, interval_months = 3) { starts <- seq(start_date, end_date, by = paste(interval_months, "months")) # 修正最后一个区间的边界,避免超出指定结束日期 ends <- pmin(starts %m+% months(interval_months) - days(1), end_date) tibble(interval_start = starts, interval_end = ends) } # 示例:生成2020-2023年每3个月的区间 date_intervals <- generate_date_intervals( start_date = as.Date("2020-01-01"), end_date = as.Date("2023-12-31"), interval_months = 3 )
步骤3:自定义汇总函数(兼容缺失/重复数据)
按你的业务需求调整汇总逻辑,示例包含缺失值过滤、重复数据去重:
# 自定义汇总函数:适配缺失/重复数据 n_month_summary <- function(data, date_col = sale_date) { data %>% filter(!is.na({{ date_col }})) %>% # 过滤缺失日期的无效记录 distinct({{ date_col }}, product_id, amount, .keep_all = TRUE) %>% # 去重重复交易(按需调整规则) summarise( total_sales = sum(amount, na.rm = TRUE), avg_sale = mean(amount, na.rm = TRUE), total_orders = n(), unique_products = n_distinct(product_id, na.rm = TRUE) ) }
步骤4:用Purrr批量执行迭代汇总
使用map2()遍历起止日期对,自动完成所有区间的过滤+汇总:
# 批量迭代:遍历每个日期区间,生成汇总结果 batch_summary <- map2( .x = date_intervals$interval_start, .y = date_intervals$interval_end, .f = function(start, end) { sold_data %>% filter(sale_date >= start & sale_date <= end) %>% # 过滤当前区间数据 n_month_summary() %>% # 应用自定义汇总逻辑 mutate(interval_start = start, interval_end = end) %>% # 标记所属区间 relocate(interval_start, interval_end) # 将区间信息前置,便于查看 } ) %>% bind_rows() # 将列表格式的结果合并为单个数据框
关键特性说明
- 自定义区间间隔:通过
generate_date_intervals()的interval_months参数可设置任意月数,也可修改函数支持按天/季度间隔。若你已有现成的start_24、end_24向量,直接替换map2()的.x和.y即可。 - 兼容缺失/重复数据:汇总函数中加入了缺失值过滤和重复数据去重逻辑,你可根据业务需求调整
distinct()的去重规则(比如按订单ID而非产品ID)。 - 支持自定义汇总函数:只需替换
map2()中的n_month_summary()为你的自定义函数,只要该函数接受数据框输入即可。若需传递额外参数,可使用purrr::partial()封装,比如partial(your_summary_func, extra_param = 10)。 - 边界处理:生成日期区间时自动修正最后一个区间的结束日期,避免超出用户指定的时间范围。
内容的提问来源于stack exchange,提问作者Joseph Harvard
相关产品推荐
相关产品推荐

