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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:12:34