Вы можете использовать пакет lubridate
для расчета временных разниц входных и выходных событий.Чтобы рассчитать разницу во времени для in_time и out_time, вы можете использовать функцию mapply
.Пожалуйста, смотрите код ниже:
in_time <- structure(list(EmployeeID = 1:3, X02.01.2015 = c("02-01-2015 09:43",
"02-01-2015 10:15", "02-01-2015 10:17"), X05.01.2015 = c("05-01-2015 10:08",
"05-01-2015 10:21", "05-01-2015 09:50"), X06.01.2015 = c("06-01-2015 09:54",
"07-01-2015 09:45", "06-01-2015 10:14"), X07.01.2015 = c("07-01-2015 09:34",
NA, NA)), class = "data.frame", row.names = c(NA, -3L))
out_time <- structure(list(EmployeeID = c(1, 2, 3), X02.01.2015 = c("02-01-2015 19:43",
"02-01-2015 18:15", "02-01-2015 17:17"), X05.01.2015 = c("05-01-2015 15:02",
"05-01-2015 12:11", "05-01-2015 21:50"), X06.01.2015 = c("06-01-2015 16:34",
"07-01-2015 19:45", "06-01-2015 18:14"), X07.01.2015 = c("07-01-2015 21:34",
"NA", "NA")), row.names = c(NA, 3L), class = "data.frame")
library(lubridate)
# converse date\time into POSIXct format
in_time[, -1] <- lapply(in_time[, -1], dmy_hm)
out_time[, -1] <- lapply(out_time[, -1], dmy_hm)
# calculate time difference
result <- in_time
result[, -1] <- mapply(function(x, y) {
mapply(function(x, y) as.numeric(as.period(interval(x, y)), unit = "hours"), x, y)
}, in_time[,-1], out_time[,-1])
result
Вывод: количество времени, которое сотрудник провел на работе, в часах:
EmployeeID X02.01.2015 X05.01.2015 X06.01.2015 X07.01.2015
1 1 10 4.900000 6.666667 12
2 2 8 1.833333 10.000000 NA
3 3 7 12.000000 8.000000 NA