在r中使用dplyr根据条件减去日期

在r中使用dplyr根据条件减去日期,r,dplyr,R,Dplyr,下面是我正在使用的一个表的示例 df = data.frame(Test_ID = c('a1','a1','a1','a1','a1','a1','a1','a2','a2','a2','a2','a2','a2'), Event_ID = c('Failure_x', 'Failure_x', 'Failure_y', 'Failure_y', 'Failure_x', 'Failure_x', 'Failure_y

下面是我正在使用的一个表的示例

df = data.frame(Test_ID = c('a1','a1','a1','a1','a1','a1','a1','a2','a2','a2','a2','a2','a2'), 
            Event_ID = c('Failure_x', 'Failure_x', 'Failure_y', 'Failure_y', 'Failure_x',
                         'Failure_x', 'Failure_y', 'Failure_x', 'Failure_y', 'Failure_y',
                         'Failure_x','Failure_x', 'Failure_y'),
            Fail_Date = c('2018-10-10 17:52:20', '2018-10-11 17:02:16', '2018-10-14 12:52:20',
                          '2018-11-11 16:18:34', '2018-11-12 17:03:06', '2018-11-25 10:50:10',
                          '2018-12-01 10:28:50', '2018-09-12 19:02:08', '2018-09-20 11:32:25',
                          '2018-10-13 14:43:30', '2018-10-15 14:22:28', '2018-10-30 21:55:45',
                          '2018-11-17 11:53:35'))
我只想在失败发生在失败之后的地方减去失败日期(通过测试ID)。事件ID Failure_y的失败日期将从事件ID Failure_x的失败日期中减去。在一个团队中,我可以有多个失败。第二个故障_y将从第一个故障_y实例之后发生的故障_x中减去

我曾尝试使用dplyr创建一个列TIME\u interference\u FAILURES

library(lubridate)
df$Fail_Date = as.POSIXct(as.character(as.factor(df$Fail_Date)),format="%Y-%m-%d %H:%M:%S")
df = df %>% group_by(Test_ID) %>% 
mutate(TIME_BETWEEN_FAILURES = ifelse(Event_ID == "Failure_y" & lag(Event_ID) == "Failure_x", 
                                    difftime(Fail_Date, first(Fail_Date),units = "hours"),''))`
我只能使用dplyr中的first()为第一个实例正确创建两次失败之间的时间。这就是我目前所处的困境。在此问题上的任何帮助都将不胜感激



分析所需的输出。

谢谢。 干杯。

df%>%
分组依据(gr=rev(累积值)(rev(Event\u ID)=“Failure\u y”)),测试ID%%>%
变异(两次失败之间的时间=ifelse(n()>1&事件ID=“失败”,difftime(失败日期[n()],失败日期[1L],单位=“小时”),NA))
#一个tibble:13x5
#分组:gr,测试编号[6]
测试ID事件ID失败日期gr时间两次失败之间
1 a1故障x 2018-10-10 17:52:20 6 NA
2 a1故障x 2018-10-11 17:02:16 6 NA
2018年10月14日12:52:20 6 91
4 a1故障日期2018-11-11 16:18:34不适用
5 a1故障x 2018-11-12 17:03:06 4 NA
6 a1故障x 2018-11-25 10:50:10不适用
7 a1故障日期2018-12-01 10:28:50 449。
8 a2故障x 2018-09-12 19:02:08 3 NA
9 a2故障日期2018-09-20 11:32:25 3185。
10 a2故障日期2018-10-13 14:43:30 2 NA
11 a2故障x 2018-10-15 14:22:28不适用
12 a2故障x 2018-10-30 21:55:45不适用
13 a2故障时间2018-11-17 11:53:35 1790。

谢谢您的帮助。创建新组(gr)并使用difftime(Fail_Date[n()],Fail_Date[1L])使用n()函数是一个非常出色的方法。
df %>% 
  group_by(gr = rev(cumsum(rev(Event_ID)=="Failure_y")), Test_ID) %>%
  mutate(time_between_failures = ifelse(n() > 1 & Event_ID=="Failure_y", difftime(Fail_Date[n()], Fail_Date[1L], units = "hours"), NA)) 

# A tibble: 13 x 5
# Groups:   gr, Test_ID [6]
   Test_ID Event_ID  Fail_Date              gr time_between_failures
   <fct>   <fct>     <dttm>              <int>                 <dbl>
 1 a1      Failure_x 2018-10-10 17:52:20     6                   NA 
 2 a1      Failure_x 2018-10-11 17:02:16     6                   NA 
 3 a1      Failure_y 2018-10-14 12:52:20     6                   91 
 4 a1      Failure_y 2018-11-11 16:18:34     5                   NA 
 5 a1      Failure_x 2018-11-12 17:03:06     4                   NA 
 6 a1      Failure_x 2018-11-25 10:50:10     4                   NA 
 7 a1      Failure_y 2018-12-01 10:28:50     4                  449.
 8 a2      Failure_x 2018-09-12 19:02:08     3                   NA 
 9 a2      Failure_y 2018-09-20 11:32:25     3                  185.
10 a2      Failure_y 2018-10-13 14:43:30     2                   NA 
11 a2      Failure_x 2018-10-15 14:22:28     1                   NA 
12 a2      Failure_x 2018-10-30 21:55:45     1                   NA 
13 a2      Failure_y 2018-11-17 11:53:35     1                  790.