在R中为含重复小时索引的数据框生成分钟列
解决方案
针对你的需求,我们可以通过按小时分组后生成组内递增序列的方式实现,完美适配每组行数不固定、部分小时缺失的场景。下面提供两种常用实现方式:
方法一:使用dplyr包(推荐,代码更直观)
通过dplyr的分组和行号函数,快速计算每组的分钟值:
library(dplyr) # 处理数据:转换小时为数值,按小时分组生成分钟列 df <- df %>% # 将小时字符串转为数值,用于计算起始分钟 mutate(hour_num = as.numeric(hours)) %>% # 按小时分组 group_by(hours) %>% # 每组内的分钟值 = 小时*60 + 组内行号(从1开始递增) mutate(minutes = hour_num * 60 + row_number()) %>% # 取消分组 ungroup() %>% # 可选:删除中间生成的hour_num列 select(-hour_num)
逻辑说明
row_number()会为每个小时组内的行依次分配1、2、3...的序号,自动适配组内任意行数;- 起始分钟计算为
小时数*60 +1,比如"00"组起始为1,"01"组起始为61,"23"组起始为1381; - 缺失的小时不会被处理,完全不影响现有分组的计算。
方法二:基础R实现(无需额外包)
如果不想加载第三方包,可以用ave()函数实现分组计算:
# 先将小时字符串转为数值 df$hour_num <- as.numeric(df$hours) # 按小时分组生成分钟序列 df$minutes <- ave(df$hour_num, df$hours, FUN = function(x) { # 计算当前组的起始分钟 start_min <- x[1] * 60 + 1 # 生成从start_min开始,长度等于组内行数的递增序列 start_min:(start_min + length(x) - 1) }) # 可选:删除中间列 df$hour_num <- NULL
示例验证
我们用模拟数据测试效果:
# 模拟包含不规则行数、循环小时的数据集 df <- data.frame( hours = c(rep("00", 5), rep("01", 3), rep("23", 4), rep("00", 6)) ) # 用dplyr处理后的结果 df_processed <- df %>% mutate(hour_num = as.numeric(hours)) %>% group_by(hours) %>% mutate(minutes = hour_num * 60 + row_number()) %>% ungroup() print(df_processed)
输出结果片段:
hours hour_num minutes 1 00 0 1 2 00 0 2 3 00 0 3 4 00 0 4 5 00 0 5 6 01 1 61 7 01 1 62 8 01 1 63 9 23 23 1381 10 23 23 1382 ...
可以看到,每组的分钟值都按要求递增,完全适配不规则行数和循环小时的场景。
内容的提问来源于stack exchange,提问作者Zakher Bouragaoui
相关产品推荐
相关产品推荐

