Вычитание дат на основе условий с использованием dplyr в r - PullRequest
2 голосов
/ 12 марта 2019

Ниже приведен пример таблицы, с которой я работаю.

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'))

Я хочу вычесть даты отказов (по Test_ID) только в том случае, если Failure_y возникает после Failure_x. Fail_Date для Event_ID Failure_y будет вычтено из Fail_Date для Event_ID Failure_x. Внутри группы у меня может быть несколько Failure_y. Второй Failure_y будет вычтен из Failure_x, возникшего после первого экземпляра Failure_y.

Я пытался использовать dplyr для создания столбца TIME_BETWEEN_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"),''))`

Мне удалось правильно создать Time_BETWEEN_FAILURES только для первого экземпляра, используя first () в dplyr. Вот где я сейчас застрял. Любая помощь в этом вопросе будет оценена.


Это результат приведенного выше фрагмента кода. enter image description here


Выходные данные, необходимые для анализа.
Это идеальный ответ, необходимый для моего анализа.

enter image description here

Спасибо. Приветствия.

1 Ответ

1 голос
/ 12 марта 2019
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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...