在R中按时间连续性规则分组数据并汇总薪资
在R中按时间连续性分组汇总薪资
问题说明
需按NAME和CLASS分组后,依据TIME的连续性规则合并分组并汇总薪资:
TIME为字符类型,格式为「开始时间结束时间」(例如1213代表12点至13点)- 连续判定规则:前一项的结束时间等于后一项的开始时间(如
1213、1314、1415属于连续序列) - 连续序列需合并为单个组,
TIME显示为「首个开始时间+最后一个结束时间」(上述示例合并为1215),并汇总该组薪资;不连续的TIME则各自单独成组
示例输入数据
df <- data.frame(NAME = c("ALEX", "ALEX", "ALEX", "BRODI", "BRODI", "BRODI"), CLASS = c("A", "A", "A", "B", "B", "B"), TIME = c(1213, 1314, 1415, 1213, 1415, 1617), SALARY = c(100, 200, 300, 100, 200, 300))
期望输出结果
df2 <- data.frame(NAME = c("ALEX", "BRODI", "BRODI", "BRODI"), CLASS = c("A", "B", "B", "B"), TIME = c(1215, 1213, 1415, 1617), SALARY = c(600, 100, 200, 300))
解决方案
使用dplyr包实现分组逻辑,步骤为拆分时间字段、标记连续组、汇总分组数据,完整代码如下:
library(dplyr) df_processed <- df %>% # 拆分TIME为开始/结束时间,转为数值型便于判断 mutate( start_time = as.numeric(substr(TIME, 1, 2)), end_time = as.numeric(substr(TIME, 3, 4)) ) %>% # 按NAME、CLASS分组,每组内按开始时间排序 group_by(NAME, CLASS) %>% arrange(start_time, .by_group = TRUE) %>% # 标记连续状态,并生成连续组ID mutate( is_continuous = ifelse(row_number() == 1, TRUE, start_time == lag(end_time)), group_id = cumsum(!is_continuous) ) %>% # 按新分组汇总数据 group_by(NAME, CLASS, group_id) %>% summarise( TIME = paste0(first(start_time), last(end_time)), SALARY = sum(SALARY), .groups = "drop" ) %>% # 移除临时分组ID列 select(-group_id) # 查看最终结果 df_processed
代码解释
substr(TIME, 1, 2)/substr(TIME, 3, 4):拆分TIME字符串,提取独立的开始、结束时间arrange(start_time, .by_group = TRUE):确保每组内时间按顺序排列,保证连续性判断的准确性cumsum(!is_continuous):生成连续组的唯一ID,每遇到一次不连续情况,分组ID递增,将连续时间归为同一组paste0(first(start_time), last(end_time)):合并连续组的首尾时间,生成新的TIME值;sum(SALARY)完成薪资汇总
内容的提问来源于stack exchange,提问作者Fadhil Dzikri
相关产品推荐
相关产品推荐

