根据条件计算经过时间

时间:2018-07-12 12:33:34

标签: r

我想计算出满足条件时阶段之间平均经过的时间,但是我完全不知道该怎么做。我生成了一个虚拟数据集。在结果列中,您有两个条件(“失败”,“成功”)。我要计算的是,当第一个“失败”出现时,要多长时间才能再次出现“成功”。例如:

  

成功->成功->失败->失败->失败->成功->失败->成功

由于每个步骤之间的时间为24小时,因此我们从第一个“失败”开始计数,直到第一个“成功”出现为止。在这种情况下,多数民众赞成3x24h = 72hours。然后再次是成功,然后是失败,然后再次是1x24h。多数民众赞成(4 * 24h)/ 2 = 48h平均时间。谢谢:)

library(lubridate)
id        <- c(1:10)
result    <- c('Success', 'Success', 'Failure', 'Failure', 'Success', 'Failure', 'Failure', 'Failure', 'Success', 'Failure' )
time      <- c("2018-07-12 12:24:00 CEST", "2018-07-11 19:31:00 CEST", "2018-07-10 08:12:00 CEST", "2018-07-09 02:22:00 CEST", "2018-07-08 22:33:00 CEST", "2018-07-07 12:34:00 CEST", "2018-07-06 07:55:00 CEST", "2018-07-05 03:44:00 CEST", "2018-07-04 17:33:00 CEST", "2018-07-03 19:22:00 CEST")
df        <- as.data.frame(cbind(id, result, time))
df$result <- as.factor(df$result)  
df$time   <- ymd_hms(df$time)
df

1 个答案:

答案 0 :(得分:0)

根据您的示例df: 计算从第一次失败到第一次成功的新时间之间的时间差。因此向前计数。这样一来,上一次仍然是NA,因为此后没有记录。 res_count考虑到这一点,只要此记录为不适用,就不计入平均值。

library(dplyr)


   df %>% 
  mutate(res_time = ifelse(result == "Failure", time - lead(time), 0),
         res_count = ifelse(result == "Failure" & result != lag(result) & !is.na(res_time), 1, 0)) %>% 
  summarise(average_time = sum(res_time, na.rm = TRUE) / sum(res_count))

  average_time
1     50.33333

如果您在汇总之前停下,您将有一个这样的表:

   id  result                time  res_time res_count
1   1 Success 2018-07-12 12:24:00  0.000000         0
2   2 Success 2018-07-11 19:31:00  0.000000         0
3   3 Failure 2018-07-10 08:12:00 29.833333         1
4   4 Failure 2018-07-09 02:22:00  3.816667         0
5   5 Success 2018-07-08 22:33:00  0.000000         0
6   6 Failure 2018-07-07 12:34:00 28.650000         1
7   7 Failure 2018-07-06 07:55:00 28.183333         0
8   8 Failure 2018-07-05 03:44:00 10.183333         0
9   9 Success 2018-07-04 17:33:00  0.000000         0
10 10 Failure 2018-07-03 19:22:00        NA         1