使用 R 创建房间使用增量时隙数据帧

问题描述 投票:0回答:1

我正在尝试创建一个供房间使用的热图数据框。

id 房间 开始 完成
1 A室 周一 09:00:00 11:00:00
2 A室 周二 09:00:00 10:00:00
3 A室 周一 10:00:00 14:30:00
4 B室 周三 09:00:00 11:00:00
df <- data.frame(id = c(1:4),
room = c("room a", "room a", "room a", "room b"),
day = c("Mon", "Tue", "Mon", "Wed"),
start = c("09:00", "09:00", "10:00", "09:00"),
end = c("11:00", "10:00", "14:30", "11:00"))

转换成数据框,我可以将其转换为热图,例如:

房间 9 10 11 12 13 14 15 16 17
A室 周一 1 2 1 1 1 1 0 0 0
A室 周二 1 0 0 0 0 0 0 0 0
A室 周三 0 0 0 0 0 0 0 0 0
A室 周四 0 0 0 0 0 0 0 0 0
A室 周五 0 0 0 0 0 0 0 0 0
B室 周一 0 0 0 0 0 0 0 0 0
B室 周二 0 0 0 0 0 0 0 0 0
B室 周三 1 1 1 0 0 0 0 0 0
B室 周四 0 0 0 0 0 0 0 0 0
B室 周五 0 0 0 0 0 0 0 0 0

该时间段内的每次预订都应增加小时窗口(或半小时,算作所使用的整小时)。大约有 50 间客房,大约有 2000 笔预订。

我尝试过一个可怕的嵌套循环,循环遍历每个事件 ID、星期几、时间段,但没有任何乐趣(而且我太尴尬了,无法在此处输入代码!)。我怀疑如果有人有时间的话,矢量化函数可能会获胜?非常感谢。

r vectorization
1个回答
0
投票

周三 B 室的预期结果与其他房间(间隔为右开)不一致。

df <- data.frame(id = c(1:4),
                 room = c("room a", "room a", "room a", "room b"),
                 day = c("Mon", "Tue", "Mon", "Wed"),
                 start = c("09:00", "09:00", "10:00", "09:00"),
                 end = c("11:00", "10:00", "14:30", "11:00"))
library(data.table)
setDT(df)
library(chron)
df[, c("start", "end") := .(times(paste0(start,":00")), times(paste0(end,":00")))]

schedule <- CJ(day = c("Mon", "Tue", "Wed", "Thu", "Fri"), 
               time = times("09:00:00") + (0:8)/24,
               room = c("room a", "room b"))

occ <- df[schedule, .(day = i.day, room = i.room, time = i.time, id), 
          on = c("day==day", "room==room","start<=time", "end>time")]
occ <- occ[, sum(!is.na(id), na.rm = TRUE), by = .(room, day, time)]
occ[, time := floor(time * 24)]
occ[, day := factor(day, c("Mon", "Tue", "Wed", "Thu", "Fri"), ordered = TRUE)]

dcast(occ, room + day ~ time)
#      room day  9 10 11 12 13 14 15 16 17
# 1: room a Mon  1  2  1  1  1  1  0  0  0
# 2: room a Tue  1  0  0  0  0  0  0  0  0
# 3: room a Wed  0  0  0  0  0  0  0  0  0
# 4: room a Thu  0  0  0  0  0  0  0  0  0
# 5: room a Fri  0  0  0  0  0  0  0  0  0
# 6: room b Mon  0  0  0  0  0  0  0  0  0
# 7: room b Tue  0  0  0  0  0  0  0  0  0
# 8: room b Wed  1  1  0  0  0  0  0  0  0
# 9: room b Thu  0  0  0  0  0  0  0  0  0
#10: room b Fri  0  0  0  0  0  0  0  0  0
© www.soinside.com 2019 - 2024. All rights reserved.