如何用lubridate与dplyr提取日期生成票量年-月汇总表
R 语言实现年-月维度开票量交叉统计落地方案
常见实现卡点
使用lubridate+dplyr链路无法得到预期结果,通常是以下三类问题导致:
- 原始列映射错位:示例给出的原始结构中,日期字符串被标记为
number_of_tickets字段、开票数值被标记为date字段,构建分析用数据框时若未对齐对应关系,所有后续计算都会出错 - 日期解析格式不匹配:现有日期为「日-月-年」格式(如
01-01-2019),若使用默认的年-月-日解析规则,会输出全空值,导致分组维度完全失效 - 月份顺序混乱:若直接将月份转为文本名称,汇总结果会按英文字母顺序排列月份,无法匹配1-12月的自然展示顺序
分步实现流程
- 加载所需依赖包
library(dplyr) library(lubridate) library(tidyr) - 构建规范原始数据集
对齐列的对应关系:number_of_tickets为数值型开票量,date为字符串格式的开票日期,代码示例可直接替换为本地读取的业务数据源:# 示例原始数据(替换为实际业务数据即可) ticket_raw <- tibble( number_of_tickets = c(1500, 1200, 2000, 1800, 2500, 3200), date = c("01-01-2019", "15-01-2019", "03-02-2019", "10-02-2020", "22-03-2020", "05-03-2020") ) - 数据清洗与维度提取
适配自定义日期格式,提取年、月统计维度,同时固定月份的排列顺序:ticket_clean <- ticket_raw %>% mutate( # 按日-月-年规则解析日期为标准Date类型 date_parsed = dmy(date), # 提取年份作为行维度 stat_year = year(date_parsed), # 提取月份作为列维度,固定1-12月的顺序与展示标签 stat_month = factor( month(date_parsed), levels = 1:12, labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") ) ) - 分组汇总累计开票量
monthly_summary <- ticket_clean %>% group_by(stat_year, stat_month) %>% summarise( total_count = sum(number_of_tickets, na.rm = TRUE), .groups = "drop" ) - 生成交叉统计结果
通过宽格式转换,实现“行对应年份、列对应月份”的目标结构:cross_stat_result <- monthly_summary %>% pivot_wider( id_cols = stat_year, names_from = stat_month, values_from = total_count, # 无数据的月份自动补0 values_fill = 0 )
输出结果说明
最终生成的cross_stat_result完全匹配预期展示效果:
- 每行对应一个统计年份
- 每列对应一个自然月的累计开票总数量
- 列的展示顺序固定为Jan到Dec,不会出现字母序混乱的问题
内容的提问来源于stack exchange,提问作者Jaikishore Verma
相关产品推荐
相关产品推荐

