繁体   English   中英

时间块覆盖热图数据重塑

[英]time block coverage heat map data reshaping

我正在尝试使用非常奇怪的数据结构创建热图

您可以使用以下代码生成一些示例数据(通常效率非常低):

times<-sort(format(seq.POSIXt(as.POSIXct(Sys.Date()),as.POSIXct(Sys.Date()+1),by = "5 min"),"%H%M"))
set.seed(922)
sample.data<-as.data.frame(matrix(NA,nrow = 2000,ncol = 10))
names(sample.data)<-c("INDEX","DAY1","START1","END1","DAY2","START2","END2","DAY3","START3","END3")
for(i in 1:nrow(sample.data)){
  sample.data[i,"INDEX"]<-sample(1:100,1,replace = T)
  sample.data[i,"DAY1"]<-sample(c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"),1,replace = F)
  sample.data[i,"START1"]<-sample(times,1,replace = T)
  sample.data[i,"END1"]<-sample(times,1,replace = T)
  sample.data[i,"DAY2"]<-sample(c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"),1,replace = F)
  sample.data[i,"START2"]<-sample(times,1,replace = T)
  sample.data[i,"END2"]<-sample(times,1,replace = T)
  sample.data[i,"DAY3"]<-sample(c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"),1,replace = F)
  sample.data[i,"START3"]<-sample(times,1,replace = T)
  sample.data[i,"END3"]<-sample(times,1,replace = T)
}

data<-sample.data%>%
  filter(START1<END1 & START2<END2 & START3<END3 & DAY1!=DAY2 & DAY1!=DAY3 & DAY2!=DAY3)

我知道这是丑陋和低效的,但数据大致在这个结构中。 您可以将此视为在任何给定时间您在机场所说的员工人数,其中每一行是员工的轮班时间。

我想创建一个热图,每天的时间分为y轴上的5分钟段和x轴上的星期几。 我是否必须按5分钟的时间段收集列和组? 我没有任何线索。

如果数据是正确的结构,我可以按工作日和不同的5分钟块进行分组,并计算机场有一个观察单位的每一行。 我只是不知道我怎么会得到dplyr说有一个人在没有明确地调用它的情况下工作,而且我不知道如何在没有for循环的情况下这样做。 如果我需要解释一下我的目标是什么,或者如果你对如何以正确的方式获取我的数据有任何明智的想法,或者我甚至以正确的方式考虑这个问题,请告诉我。 我一直在把桌子撞到桌子上,我需要暂时离开问题一分钟,但是如果你执行下面的绘图代码就会出现热量图:

ggplot(data, aes(x = DAY, y = TIME_CHUNK))+
geom_tile(aes(fill = TOTAL_EMPLOYEES))+
geom_text(aes(label = TOTAL_EMPLOYEES), colour = "white",size = 3)

谢谢你的时间...

这是一个部分解决方案,大部分都在那里。 如果我有时间,我会尽力完成。

首先,我将使用以下技术重塑数据: https//stackoverflow.com/a/56605646/6851825

DAY <- grep("DAY", names(data))
START_END <- grep("START|END", names(data))
data_long <- cbind(stack(data, select = DAY), stack(data, select = START_END))
names(data_long) <- c("WEEKDAY", "DAYNUM", "TIME", "STATUS")

在这里,我将进行更多重塑以订购工作日并将TIME转换为小数,并跟踪累积计数

library(tidyverse)
data_long_count <- data_long %>%
mutate(WEEKDAY = factor(WEEKDAY, levels = c("Sunday", "Monday", "Tuesday", 
                          "Wednesday", "Thursday", "Friday", "Saturday")),
       TIME_dec = as.numeric(TIME %>% str_sub(end = 2)) +
         as.numeric(TIME %>% str_sub(start = 3))/60,
       STATUS = STATUS %>% str_remove("[0-9]"),
       count_chg = if_else(STATUS == "START", 1, -1)) %>%
arrange(WEEKDAY, TIME_dec) %>%
mutate(employee_count = cumsum(count_chg)) 

[缺失步骤:填写所有分钟,无变化。 打算使用padr包,但它更喜欢使用datetimedate 或者可以使用geom_rect来回避它。]

没有其中任何一个,这个热图是“不稳定的”b / c它只有变化发生的条纹而不是所有的分钟。

ggplot(data_long_count, aes(WEEKDAY, TIME_dec, fill = employee_count)) + geom_tile()

我认为应该这样做

clean_colnames <- function(col_inds) {
  data %>% select(INDEX, day = col_inds[1], start = col_inds[2], end = col_inds[3])
}

bind_rows(clean_colnames(2:4), clean_colnames(5:7), clean_colnames(8:10))  %>% 
  gather(key = start_end, value = time, -INDEX, -day) %>% 
  mutate(time = paste0("20190101 ", time) %>% lubridate::ymd_hm()) %>% 
  padr::pad(group = c("INDEX", "day")) %>% 
  count(day, time) %>% 
  mutate(time = paste0(substr(time, 12, 13), substr(time, 15, 16)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM