创建一个房间使用增量时间槽框架使用R

wvt8vs2t  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我正在尝试创建一个用于房间的热图框架。
| ID|房间|天|开始|完成|
| --|--|--|--|--|
| 1 |室A| Mon|九点整|十一点整|
| 2 |室A| Tue|九点整|十点整|
| 3 |室A| Mon|十点整|14点半|
| 4 |B室|Wed|九点整|十一点整|

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| Mon| 1 | 2 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
| 室A| Tue| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 室A| Wed| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 室A| Thu| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 室A| Fri| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| B室|Mon| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| B室|Tue| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| B室|Wed| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| B室|Thu| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| B室|Fri| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
小时窗口应增加每预订在该插槽(或半小时,计为完整的一小时正在使用)。它的约2000预订约50间客房。
我已经尝试了一个可怕的嵌套循环,循环遍历每个事件ID,一周中的某一天,时隙,但没有快乐(我太激动了,无法在这里输入代码!)。我怀疑矢量化函数可能会赢得这一天,如果有人有时间?提前感谢。

inkz8wg9

inkz8wg91#

你对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)), 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

字符串

相关问题