Сложная часть заключалась в том, чтобы преобразовать строки символов в реальное время. Это работает для вас?
library(tidyverse)
df <- tibble(
'ID' = c('1','1','1','2','2','2'),
'start' = c('06:00', '08:00', '12:15', '06:00','12:30', '18:00'),
'end' = c('07:00', '08:30', '12:45', '06:45', '13:00', '18:45'),
'value' = c('35', '34', '30', '45', '50', '32'))
durFn <- function(stDur){
st <- str_split(stDur, ":") %>%
unlist() %>%
as.double()
dur <- lubridate::duration(hours = st[1], minutes = st[2])
}
df %>%
as_tibble() %>%
mutate(startD = map(start, durFn),
endD = map(end, durFn),
value = as.double(value),
minutes = map2_dbl(startD, endD,
~ suppressMessages(as.double(.y - .x) / 60 )),
minutes = minutes %% 1440, # Just in case we wrapped around midnight
basis = value/ minutes) %>%
select(- startD, - endD)
Я создал lubridate::duration
для вашего начала и конца. Они в секундах. Я взял их разницу и разделил на 60, чтобы получить минуты. Тогда ваша база - это всего лишь значение / минуты.