The data will be used to check if a 1 hourly interval is within timestamp1 and timestamp2. The %within% function from library(lubridate) can do this. However, for every id and corresponding timestamps this needs to do it 24 times (0:00:000 till 23:00:000). So every id should give 24 results with TRUE or FALSE.
So here's the sample data(This is what we got from Merijn van Tilborg's solution):
library(lubridate)
id <- c(1, 2 ,3 ,4 ,5)
timestamp1 <- structure(c(1618725826, 1618808778, 1618981628, 1619070713, 1619070218
), class = c("POSIXct", "POSIXt"), tzone = "")
timestamp2 <- structure(c(1618745800, 1618819480, 1618999145, 1619082202, 1619081591
), class = c("POSIXct", "POSIXt"), tzone = "")
results <- lapply(id, function(id) {
matching_hours[as.POSIXlt(timestamp1[id])$hour:as.POSIXlt(timestamp2[id])$hour] <- T
data.table(t(matching_hours))
})
results <- rbindlist(results)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 1: FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 2: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 3: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 4: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 5: FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
What's expected is that for every id to be ran 24 times on a one hour interval. A true or false if the one hour interval is in between timestamp1 and timestamp2.