Подсчитайте, сколько отчетов запущено за определенное время - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь подсчитать, сколько отчетов выполняется в определенное время.

Данные как:

ReportID    StartTime   Duration  
   1 2018-11-02 13:00:00  240 seconds  
   2 2018-11-02 14:00:00  300 seconds  
   3 2018-11-02 14:01:15  300 seconds  
   4 2018-11-02 14:00:00 5000 seconds

Идеальный результат будет:

Time #ReportsRunning
2018-11-01 13:00:00 0
2018-11-02 13:00:00 1  
2018-11-02 14:00:00 2
2018-11-02 15:00:00 1

Есть ли что-нибудь подобное? Я думаю о добавлении столбца к каждой отметке времени, которую я хочу проверить. Но это сделает стол чрезвычайно широким.


Данные в воспроизводимом виде:

df1 <- data.frame(
  ReportID = 1:4,
  StartTime = as.POSIXct(c("2018-11-02 13:00:00", "2018-11-02 14:00:00",
                           "2018-11-02 14:01:15", "2018-11-02 14:00:00")),
  Duration = as.difftime(c(240, 300, 300, 5000), units = "secs")
)

df2 <- data.frame(
  Time = as.POSIXct(c("2018-11-01 13:00:00", "2018-11-02 13:00:00",
                      "2018-11-02 14:00:00", "2018-11-02 15:00:00"))
)

1 Ответ

0 голосов
/ 09 ноября 2018

Вот базовое решение R:

df2$`#ReportsRunning` <- sapply(
  df2$Time,
  function(x) sum(x >= df1$StartTime & x <= df1$StartTime + df1$Duration)
)

df2
#                  Time #ReportsRunning
# 1 2018-11-01 13:00:00               0
# 2 2018-11-02 13:00:00               1
# 3 2018-11-02 14:00:00               2
# 4 2018-11-02 15:00:00               1

Но если ваши данные большие, то будет гораздо эффективнее использовать пакет IRanges от BioConductor:

library(IRanges)

ranges <- IRanges(as.integer(df1$StartTime), width = as.integer(df1$Duration))
values <- as.integer(df2$Time)

df2$`#ReportsRunning` <- countOverlaps(values, ranges)

df2
#                  Time #ReportsRunning
# 1 2018-11-01 13:00:00               0
# 2 2018-11-02 13:00:00               1
# 3 2018-11-02 14:00:00               2
# 4 2018-11-02 15:00:00               1
...