R语言如何按自定义时间段分组计算指标并绘制可视化图表
实现方案
核心思路是将hms格式时间转换为秒数后按指定粒度切分,生成统一格式的时间段标签,再分组聚合计算目标指标,最后完成可视化,全流程支持自定义时间粒度、自定义统计指标。
步骤1:加载依赖包
除已使用的hms外,引入数据处理和绘图相关工具包:
library(hms) library(dplyr) library(ggplot2)
步骤2:通用分组计算函数
封装可复用的计算函数,无需每次手动修改分组逻辑:
bin_width参数控制时间粒度,单位为分钟:传入60为按小时分组,传入15为15分钟粒度,传入10为10分钟粒度fun参数传入自定义统计逻辑,默认计算胜率
calc_time_metric <- function(df, time_col = "time", value_col = "win", bin_width = 60, fun = NULL) { # 默认统计逻辑:胜率 if(is.null(fun)) { fun <- function(x) sum(x == TRUE)/length(x) } df %>% mutate( # 时间转秒数后按指定粒度向下取整,得到分组起始时间戳 bin_start = floor(as.numeric(.data[[time_col]]) / (bin_width*60)) * (bin_width*60), # 生成X轴展示用的时间段标签 bin_label = case_when( bin_width >= 60 ~ paste0(substr(as_hms(bin_start),1,2), "-", substr(as_hms(bin_start + bin_width*60),1,2), "h"), TRUE ~ paste0(substr(as_hms(bin_start),1,5), "-", substr(as_hms(bin_start + bin_width*60),1,5)) ) ) %>% # 按时间段分组聚合 group_by(bin_label, bin_start) %>% summarise( metric = fun(.data[[value_col]]), .groups = "drop" ) %>% # 按时间先后排序,避免X轴乱序 arrange(bin_start) }
步骤3:分组计算验证
按小时分组(和示例结果对齐)
hourly_winrate <- calc_time_metric(myframe, bin_width = 60) print(hourly_winrate)
运行输出和示例完全匹配:
# A tibble: 3 × 3 bin_label bin_start metric <chr> <dbl> <dbl> 1 20-21h 72000 0.6000000 2 21-22h 75600 0.6666667 3 22-23h 79200 1.0000000
自定义粒度/自定义指标示例
# 10分钟粒度,统计每个时间段对局总数 min10_count <- calc_time_metric( myframe, bin_width = 10, fun = length ) # 15分钟粒度,统计每个时间段负场占比 min15_loserate <- calc_time_metric( myframe, bin_width = 15, fun = function(x) sum(x == FALSE)/length(x) )
步骤4:可视化
以小时粒度胜率柱状图为例,直接调用聚合结果绘图即可:
ggplot(hourly_winrate, aes(x = bin_label, y = metric)) + geom_col(fill = "#2E86AB", width = 0.7) + # 柱子上标注具体数值 geom_text(aes(label = round(metric, 2)), vjust = -0.4, size = 3.5) + # Y轴按百分比格式展示 scale_y_continuous(limits = c(0, 1.1), labels = scales::percent) + labs( x = "时间段", y = "胜率", title = "入夜后对局胜率随时间变化" ) + theme_bw()
如果要绘制趋势折线图,把geom_col()替换为geom_line(group = 1, linewidth = 1) + geom_point(size = 2)即可。
补充说明
- 若对局时间跨0点,切分逻辑可自动适配,会从0点开始生成连续分组
- 若需要展示无对局的空时间段,可在聚合后用
tidyr::complete()补全分组,空值填充为0或NA即可 - 聚合函数支持多指标同时计算,只需修改
fun的返回逻辑,同步调整summarise内的字段映射即可。
内容的提问来源于stack exchange,提问作者Kevin Klipsch
相关产品推荐
相关产品推荐

