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