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

在R中按用户分组,基于shift_change_ind生成递增shift_id

高效生成分组Shift ID的解决方案

针对百万行级别的数据集,按user分组生成shift_id,每当shift_change_ind为1时计数器递增,推荐用向量化的累加操作实现,完全避免循环,效率拉满:

方案1:data.table(性能最优,适合超大数据)

data.table的分组累加操作是目前处理大数据最快的方式之一:

library(data.table)

# 假设数据集为dt,包含user、datetime、shift_change_ind字段
dt[, shift_id := cumsum(shift_change_ind) + 1, by = user]

逻辑说明:

  • 按user分组后,用cumsum()对shift_change_ind做累加,每遇到1就自动加1
  • 加1是为了让第一个班次的ID从1开始(因为第一个行的shift_change_ind通常为0,无前置时间间隔)

方案2:dplyr(语法更直观)

如果习惯tidyverse语法,用dplyr的窗口函数同样高效:

library(dplyr)

dt <- dt %>%
  group_by(user) %>%
  mutate(shift_id = cumsum(shift_change_ind) + 1) %>%
  ungroup()

注意事项

  • 确保shift_change_ind的定义准确:每个user的第一行shift_change_ind应为0(无前置时间戳,不算新班次),否则需根据实际情况调整初始值(比如用cumsum(shift_change_ind) + (1 - first(shift_change_ind)))
  • 这两种方法都是纯向量化计算,不会出现rleid处理连续1时的分组错误问题,因为每个shift_change_ind=1都会独立触发计数器递增

内容的提问来源于stack exchange,提问作者rastrast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:50:14