这实际上只是一个非常简单的转置应用和最后的观察结果。
这是我的员工:
emp <- data.frame(empid = 001, timein = as.POSIXct('2018-05-31 8:00'), timeout = as.POSIXct('2018-05-31 17:00'))
这是我最后的观察结转包装(但也有zoo::na.locf)
locf <- function(y) c(NA, na.omit(y))[cumsum(!is.na(y))+1]
现在转置:
emplong <- reshape(emp, direction='long', idvar='empid', varying=list(2:3),
times=c('in', 'out'), timevar='status')
这给出了:
empid status timein
1.in 1 in 2018-05-31 08:00:00
1.out 1 out 2018-05-31 17:00:00
现在创建一个名册:
roster <- data.frame('times' = seq(
from=as.POSIXct('2018-05-31 00:00:00'),
to=as.POSIXct('2018-06-01 00:00:00'),
by=15*60))
并合并
roster <- merge(roster, emplong[, -1], by.x='times', by.x='timein', all=T)
和 LOCF
roster$status <- locf(roster$status )
roster$status[is.na(roster$status )] <- 'out'
这给出了:
> roster
times status
1 2018-05-31 00:00:00 out
2 2018-05-31 00:15:00 out
3 2018-05-31 00:30:00 out
4 2018-05-31 00:45:00 out
5 2018-05-31 01:00:00 out
...
31 2018-05-31 07:30:00 out
32 2018-05-31 07:45:00 out
33 2018-05-31 08:00:00 in
34 2018-05-31 08:15:00 in
...
67 2018-05-31 16:30:00 in
68 2018-05-31 16:45:00 in
69 2018-05-31 17:00:00 out
70 2018-05-31 17:15:00 out