我在试着创建一个房间用的热图数据框.

id room day start finish
1 ROOM A Mon 09:00:00 11:00:00
2 ROOM A Tue 09:00:00 10:00:00
3 ROOM A Mon 10:00:00 14:30:00
4 ROOM B Wed 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"))

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

room day 9 10 11 12 13 14 15 16 17
ROOM A Mon 1 2 1 1 1 1 0 0 0
ROOM A Tue 1 0 0 0 0 0 0 0 0
ROOM A Wed 0 0 0 0 0 0 0 0 0
ROOM A Thu 0 0 0 0 0 0 0 0 0
ROOM A Fri 0 0 0 0 0 0 0 0 0
ROOM B Mon 0 0 0 0 0 0 0 0 0
ROOM B Tue 0 0 0 0 0 0 0 0 0
ROOM B Wed 1 1 0 0 0 0 0 0 0
ROOM B Thu 0 0 0 0 0 0 0 0 0
ROOM B Fri 0 0 0 0 0 0 0 0 0

对于该时段内的每一次预订,小时窗口应递增(或计为使用了整整一小时的半小时).预订了大约2000个房间,大约50个房间.

我已经try 了一个可怕的嵌套循环,循环遍历每个活动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)), 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

R相关问答推荐

变量计算按R中的行更改

使用ggplot 2根据R中的类别排列Likert比例gplot

根据列表中项目的名称多次合并数据框和列表

更改编号列表的 colored颜色

次级y轴R gggplot2

如何按排序顺序打印一个框架中所有精确的唯一值?

如何在R中对深度嵌套的tibbles中的非空连续行求和?

如何在Chart_Series()中更改轴值的 colored颜色 ?

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

当我们有多个特殊字符时,使用gsub删除名称和代码'

计算满足R中条件的连续列

如何识别倒排的行并在R中删除它们?

将多个列值转换为二进制

使用ggplot2绘制具有边缘分布的坡度图

如何使投篮在R中保持一致

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

我怎么才能把一盘棋变成一盘棋呢?

R:部分修改矩阵对角线的有效方法

当R使用c()组合两个向量时会发生什么?