【问题标题】:A loop for 24 hours in the %within% function%within% 函数中的 24 小时循环
【发布时间】:2021-12-26 14:01:55
【问题描述】:

数据将用于检查 1 小时间隔是否在时间戳 1 和时间戳 2 内。 library(lubridate) 中的 %within% 函数可以做到这一点。但是,对于每个 id 和相应的时间戳,这需要执行 24 次(0:00:000 到 23:00:000)。所以每个 id 应该给出 TRUE 或 FALSE 的 24 个结果。

这是示例数据(这是我们从 Merijn van Tilborg 的解决方案中得到的):

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

预计每个 id 在一小时的间隔内运行 24 次。如果一小时间隔在时间戳 1 和时间戳 2 之间,则为 true 或 false。

【问题讨论】:

  • 通过提供适当的可重现示例,您可能会取得更大的成功,此代码无法运行,请考虑包括您使用%within% 尝试过的内容。如果性能是问题,我相信 bioconductor 上的 {IRanges} 包可以快速完成这种操作
  • 感谢您的回复。那我们具体应该怎么做呢?
  • 第一步是更新您的示例,以便它可以运行(在 id 定义后没有尾随逗号,正确的时间戳向量),然后还包括可重现示例的预期结果。
  • @Moody_Mudskipper 我刚刚更新了示例以及预期的结果。
  • 感谢您的努力,但我仍然不明白这个问题,您可能想阅读stackoverflow.com/questions/5963269/…。提高正确理解问题的机会的一个好方法是实际创建您期望得到的对象并将其打印在您的问题中。如果感觉手动创建太大,通常可以将数据修剪到足够小。

标签: r loops datetime lubridate


【解决方案1】:
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 

或者,如果您更喜欢表格作为输出:

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

【讨论】:

  • 感谢您的回复。我们想知道是否也可以每秒执行一次,因为我们得到的结果由于某种奇怪的原因不匹配。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多