R语言按分钟对factor格式时间列分箱统计观测频率
问题描述
持有多份结构一致的数据框,其中时间列为factor类型,存储格式为分:秒.毫秒,单份数据集总时间跨度为30分钟。需求为按分钟维度对时间做分箱,固定生成30个时间分箱,用于可视化各分钟区间内的观测值出现频率;因待处理数据框数量较多,要求处理流程尽可能避免生成冗余额外变量。
示例数据结构:
> dput(head(attackfemale1,20)) structure(list(X = c(9L, 17L, 33L, 36L, 46L, 62L, 81L, 102L, 168L, 201L, 257L, 259L, 300L, 303L, 308L, 312L, 375L), frame = c(54619L, 55577L, 57427L, 57847L, 58743L, 60145L, 61823L, 64373L, 72701L, 75933L, 83509L, 84173L, 90563L, 90831L, 91647L, 92115L, 101641L ), time.min.sec. = structure(1:17, .Label = c("30:20.63", "30:52.57", "31:54.23", "32:08.23", "32:38.10", "33:24.83", "34:20.77", "35:45.77", "40:23.37", "42:11.10", "46:23.63", "46:45.77", "50:18.77", "50:27.70", "50:54.90", "51:10.50", "56:28.03"), class = "factor"), command = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L ), .Label = "attack female", class = "factor"), ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L ), .Label = "XCB1", class = "factor")), row.names = c(NA, 17L ), class = "data.frame")
解决方案
用base R即可实现,无需加载第三方包,也不会产生冗余中间变量。把逻辑封装成单函数后可批量处理所有数据框,核心逻辑:
- 时间列是
分:秒.毫秒格式的因子,直接按:分割字符串取首段,转成整数即可得到对应分钟值,不需要做复杂的时间格式转换 - 调用
cut()做等距分箱,断点设为「数据集最小分钟值」到「最小分钟值+30」的整数序列,固定生成30个左闭右开的分钟区间 - 直接统计各分箱频数后输出可视化结果即可
可直接运行的代码如下:
count_minute_freq <- function(df) { # 仅提取一次分钟值,无多余临时变量 min_val <- as.integer(sub(":.*", "", as.character(df$time.min.sec.))) df$time_bin <- cut( x = min_val, breaks = seq(min(min_val), min(min_val) + 30, by = 1), right = FALSE, labels = paste0("Min_", 1:30) ) # 输出频数统计与柱状图 freq_res <- table(df$time_bin) barplot(freq_res, xlab = "分钟分箱", ylab = "观测频数", main = "每分钟观测值分布") return(df) } # 批量处理:把所有待处理数据框存入列表,一次性完成处理 df_list <- list(attackfemale1, attackfemale2, attackmale1) # 替换为实际要处理的所有数据框 processed_list <- lapply(df_list, count_minute_freq)
代码会自动适配每个数据框的起始时间,固定输出30个分钟分箱。如果后续遇到时间跨小时的场景,只需要把分钟值计算逻辑替换为「总秒数/60取整」即可,不需要改动其他分箱与统计逻辑。
内容的提问来源于stack exchange,提问作者aychang
相关产品推荐
相关产品推荐

