在R语言中按时间段汇总列值:按月/季度/年度统计成本总和
在R语言中按时间段统计总成本的实现方案
前提说明
原始数据存在两个问题:日期格式不统一(混合使用-和/分隔符)、成本列带$符号,需要先完成数据清洗,再进行分组统计。以下基于tidyverse生态(包含dplyr用于分组、lubridate用于日期处理)实现需求。
1. 数据准备与清洗
先模拟并清洗数据(若已有数据框,直接从清洗步骤开始):
# 安装并加载必要包(首次使用需安装) # install.packages("tidyverse") library(tidyverse) # 模拟原始数据 raw_df <- tibble( Date = c("1-1-22", "1/1/22", "1/1/22", "2/5-22", "2/5/22", "3/5/22", "3/7/22", "12/12/22"), Cost = c("$5", "$10", "$8", "$9", "$10", "$5", "$10", "$15") # 将$X替换为实际数值 ) # 清洗数据:转换日期格式、提取数值型成本 clean_df <- raw_df %>% # 自动识别日-月-年格式(兼容-和/分隔符) mutate(Date = lubridate::dmy(Date), # 移除$符号并转为数值 Cost = as.numeric(stringr::str_remove(Cost, "\\$"))) %>% # 过滤缺失值(若存在无效Cost) drop_na(Cost)
2. 按月统计总成本
两种格式化方式可选,按需使用:
# 方式1:保留日期格式的月初时间 monthly_total <- clean_df %>% mutate(Month = lubridate::floor_date(Date, "month")) %>% group_by(Month) %>% summarise(Total_Cost = sum(Cost)) %>% ungroup() # 方式2:格式化为"年-月"文本(更直观) monthly_total <- clean_df %>% mutate(Month = format(Date, "%Y-%m")) %>% group_by(Month) %>% summarise(Total_Cost = sum(Cost)) %>% ungroup() print(monthly_total)
3. 按季度统计总成本
同样提供两种格式化方式:
# 方式1:保留日期格式的季度起始时间 quarterly_total <- clean_df %>% mutate(Quarter = lubridate::floor_date(Date, "quarter")) %>% group_by(Quarter) %>% summarise(Total_Cost = sum(Cost)) %>% ungroup() # 方式2:格式化为"年-Q季度"文本 quarterly_total <- clean_df %>% mutate(Quarter = paste0(lubridate::year(Date), "-Q", lubridate::quarter(Date))) %>% group_by(Quarter) %>% summarise(Total_Cost = sum(Cost)) %>% ungroup() print(quarterly_total)
4. 按年度统计总成本
直接按年份分组求和:
annual_total <- clean_df %>% mutate(Year = lubridate::year(Date)) %>% group_by(Year) %>% summarise(Total_Cost = sum(Cost)) %>% ungroup() print(annual_total)
注意事项
- 若原始日期为月-日-年格式(如
1/1/22是1月1日还是1月22日),需将dmy()替换为mdy() - 若存在大量非标准日期格式,可尝试
parse_date_time(Date, c("dmy", "mdy"))自动匹配多格式 - 若
$X代表缺失值,可保留NA并在求和时使用sum(Cost, na.rm = TRUE)忽略缺失值
内容的提问来源于stack exchange,提问作者user6063433
相关产品推荐
相关产品推荐

