Используя только базовые функции R для этих данных:
data <- data.frame(
Start_Time = as.POSIXct(c("2019-09-02 09:03:00","2019-09-02 10:35:00","2019-09-02 11:29:00","2019-09-02 12:42:00","2019-09-02 14:07:00","2019-09-02 14:22:00","2019-09-02 14:56:00"),tz = "UTC"),
End_Time = as.POSIXct(c("2019-09-02 10:32:00","2019-09-02 11:06:00","2019-09-02 12:20:00","2019-09-02 13:09:0","2019-09-02 14:22:00","2019-09-02 14:27:00","2019-09-02 15:18:00"),tz = "UTC"),
Room_ID = 1)
Решение может быть:
occupancy_rate <- function(data){
agg <- do.call(rbind,lapply(1:nrow(data),function(i){
times <- seq(data$Start_Time[i], data$End_Time[i], by = 60)
aggregate(list(occ_mins=times),list(date_hour=strftime(times,"%y-%m-%d %H")), length)
}))
with(agg,aggregate(list(occ_mins=occ_mins), list(date_hour=date_hour), function(x) sum(x)/60*100))
}
, которое дает:
occupancy_rate(data)
date_hour occupancy_rate
1 19-09-02 10 95.00000
2 19-09-02 11 96.66667
3 19-09-02 12 63.33333
4 19-09-02 13 65.00000
5 19-09-02 14 16.66667
6 19-09-02 15 43.33333
7 19-09-02 16 31.66667
Очевидно, еслинабор данных больше, вы можете посмотреть на внешние библиотеки, такие как data.table
или dplyr