[英]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
包,但它更喜歡使用datetime
或date
。 或者可以使用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.