R语言中如何按日内时段分组数据并统计各时段事件频次
R语言日内时段分组与事件频次统计实现
整体流程为:标准化Time列的时间格式,提取观测时间对应的小时值,按照给定规则映射为对应时段标签,最后按时段分组统计事件数量,全程仅需原始数据中的Time列即可完成计算。
推荐实现(tidyverse 生态)
这种写法逻辑清晰、易调整规则,是日常数据分析的常用方案。
- 先复现输入示例数据:
df <- data.frame( Date = rep("21/10/20", 7), Time = c("03:49:19","05:39:23","09:23:10","14:38:50","17:17:48","21:23:45","21:49:32") ) - 加载依赖包,完成全流程计算:
library(dplyr) library(lubridate) period_result <- df |> mutate( # 把字符串格式的Time转成标准时间类型,提取小时数 hour_value = hour(hms::as_hms(Time)), # 按规则映射时段 Period = case_when( hour_value %in% 0:9 ~ "Morning", hour_value %in% 10:17 ~ "Afternoon", hour_value %in% 18:23 ~ "Evening" ) ) |> # 按时段分组计数,指定输出列名 count(Period, name = "Count") - 输出结果和目标格式完全一致:
Period Count Morning 3 Afternoon 2 Evening 2
无依赖实现(基础R版本)
不想安装第三方包的场景下,可以直接用基础函数完成计算:
# 从标准格式的Time字符串中提取小时值 df$hour_value <- as.integer(substr(df$Time, 1, 2)) # 按小时区间映射时段标签 df$Period <- cut( x = df$hour_value, breaks = c(-1, 9, 17, 23), labels = c("Morning", "Afternoon", "Evening") ) # 统计频次并对齐目标表格结构 period_result <- as.data.frame(table(df$Period)) colnames(period_result) <- c("Period", "Count")
规则匹配校验
两套方案的区间划分完全贴合给定的时段边界,不会出现错配:
- 所有小时值在0-9的观测(对应00:00:00-09:59:59),全部归入Morning组
- 所有小时值在10-17的观测(对应10:00:00-17:59:59),全部归入Afternoon组
- 所有小时值在18-23的观测(对应18:00:00-23:59:59),全部归入Evening组
实用提示:如果原始Time列存在非补零格式(比如
9:23:10而非09:23:10),不要直接用substr截取字符串,必须先通过hms::as_hms()做格式标准化后再提取小时值,避免解析出错。
内容的提问来源于stack exchange,提问作者Tolerance487
相关产品推荐
相关产品推荐

