我正在尝试创建一个供房间使用的热图数据框。
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、星期几、时间段,但没有任何乐趣(而且我太尴尬了,无法在此处输入代码!)。我怀疑如果有人有时间的话,矢量化函数可能会获胜?非常感谢。
周三 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