按员工ID分组计算连续出勤天数平均值 R tibble操作问题
解决方案
核心思路
首先为每位员工标记所有连续出勤的独立时段,统计每个时段的出勤天数后,按员工ID分组计算均值即可。针对特殊值的处理规则如下:
Consec_Days为NA:属于员工首次出勤,是新连续时段的起点Consec_Days为0:代表连续出勤中断,是下一个新连续时段的起点Consec_Days为1:属于当前正在延续的连续时段
实现代码(tidyverse方案,适配百万行量级性能)
library(dplyr) result <- your_tibble %>% # 按员工ID分组,按出勤日期排序避免原始数据顺序混乱 group_by(Emp_ID) %>% arrange(Start_Date, .by_group = TRUE) %>% # 生成连续段ID:遇到NA或0时新建一个连续段 mutate( period_id = cumsum(ifelse(is.na(Consec_Days) | Consec_Days == 0, 1, 0)) ) %>% # 按员工+连续段分组,统计每个段的出勤天数 group_by(Emp_ID, period_id) %>% summarise(period_days = n(), .groups = "drop_last") %>% # 按员工分组计算平均连续出勤天数 summarise(avg_consec_days = mean(period_days), .groups = "drop")
样例结果验证
用你提供的样例数据计算得到的结果如下:
- 员工ID=4:仅1个连续段,共3天,平均连续出勤天数为
3 - 员工ID=3:共4个连续段,天数分别为1、3、2、1,平均连续出勤天数为
1.75
性能说明
上述方案全程使用向量化运算,百万行量级数据可在数秒内完成计算。如果数据量超过千万行,可以替换为data.table实现相同逻辑,性能会更高。
内容的提问来源于stack exchange,提问作者user3736739
相关产品推荐
相关产品推荐

