-1

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.

  • 1
    You might have more success by providing a proper reproducible example, this code doesn't run, consider including what you've tried with `%within%`. I believe the {IRanges} package on bioconductor does this kind of operation fast if performance is the issue – moodymudskipper Nov 15 '21 at 11:08
  • Thanks for the response. How exactly should we do it then? – user17356120 Nov 29 '21 at 10:54
  • First step would be to update your example so it can be run (no trailing comma after id definition, proper timestamp vectors), then also include the expected result from your reproducible example. – moodymudskipper Nov 29 '21 at 14:32
  • @Moody_Mudskipper I just updated the example along with the expected result. – user17356120 Nov 29 '21 at 15:07
  • Thanks for your effort, but I still don't understand the question, you might want to read https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example . A great way to improve your chances to have your question properly understood is to actually create the object that you expect to get as a result and print it in your question. If it feels to big to be created manually, the data can usually be trimmed down until it is small enough. – moodymudskipper Dec 02 '21 at 11:28
  • This is how you get answers really fast here, you show a simplified version of what you have, you show what you exactly expect (one often thinks explanations are clear enough, but they often really aren't, "What's expected is that for every id to be ran 24 times on a one hour interval" doesn't make any sense to me for instance), explanations around the reproducible example are just icing on the cake. – moodymudskipper Dec 02 '21 at 11:33

1 Answers1

0
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 = "")

matching_hours <- rep(F, 24)
names(matching_hours) <- 0:23

results <- lapply(id, function(id) {
  matching_hours[as.POSIXlt(timestamp1[id])$hour:as.POSIXlt(timestamp2[id])$hour] <- T
  matching_hours
})

results

# [[1]]
#     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23 
# 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]]
#     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23 
# 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]]
#     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23 
# 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]]
#     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23 
# 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]]
#     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23 
# FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Or if you prefer a table as output:

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
Merijn van Tilborg
  • 5,452
  • 1
  • 7
  • 22
  • Thank you for the response. We would like to know if it's also possible to do per second because the results we get don't match up for some odd reason. – user17356120 Nov 22 '21 at 14:17