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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:27:43