在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
相关产品推荐
相关产品推荐

