Отфильтровать сложную последовательность даты и времени, используя R - PullRequest
0 голосов
/ 14 апреля 2020

Фон

У меня есть набор данных: df, где я хотел бы сначала установить sh звездное время с первым экземпляром ' Соедините значение, а затем создайте конечное время, только , если разница между строками составляет , а не 60 секунд или меньше. Я также хотел бы отбросить повторяющиеся значения. Наконец, я бы хотел удалить все значения попыток . В конечном выводе должны быть только столбцы «Подключиться» и «Завершенный вызов».

Action          Time

Attempt        3/12/2020 10:02:43 AM
Attempt        3/12/2020 10:02:48 AM
Connect        3/12/2020 10:02:49 AM
Ended call     3/12/2020 10:11:02 AM
Attempt        3/12/2020 10:11:24 AM
Connect        3/12/2020 10:11:24 AM
Ended call     3/12/2020 10:12:22 AM
Attempt        3/12/2020 10:12:34 AM
Connect        3/12/2020 10:12:34 AM
Ended call     3/12/2020 11:20:33 AM
Ended call     3/12/2020 11:20:37 AM
Attempt        3/12/2020 11:21:08 AM
Connect        3/12/2020 11:21:09 AM
Ended call     3/12/2020 12:01:13 PM
Ended call     3/12/2020 12:04:02 PM
Attempt        3/12/2020 1:06:10 PM
Connect        3/12/2020 1:06:12 PM
Ended call     3/12/2020 2:00:10 PM
Ended call     3/12/2020 2:04:51 PM
Attempt        3/12/2020 2:04:57 PM
Connect        3/12/2020 2:04:58 PM
Ended call     3/12/2020 2:50:24 PM
Ended call     3/12/2020 2:50:46 PM

Требуемый вывод

Connect                 Ended Call

3/12/2020 10:02:49 AM   3/12/2020 10:11:02 AM
3/12/2020 10:11:24 AM   3/12/2020 11:20:33 AM
3/12/2020 11:21:09 AM   3/12/2020 12:01:13 PM
3/12/2020 1:06:12 PM    3/12/2020 2:00:10 PM
3/12/2020 2:04:58 PM    3/12/2020 2:50:24 PM

Dput

df <- structure(list(Action = structure(c(2L, 2L, 3L, 4L, 2L, 3L, 4L, 
2L, 3L, 4L, 4L, 2L, 3L, 4L, 4L, 2L, 3L, 4L, 4L, 2L, 3L, 4L, 4L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Attempt", "Connect", 
"Ended call"), class = "factor"), Time = structure(c(4L, 5L, 
6L, 7L, 8L, 8L, 9L, 10L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 2L, 
3L, 17L, 18L, 19L, 20L, 21L, 22L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), .Label = c("", "3/12/2020 1:06:10 PM", "3/12/2020 1:06:12 PM", 
"3/12/2020 10:02:43 AM", "3/12/2020 10:02:48 AM", "3/12/2020 10:02:49 AM", 
"3/12/2020 10:11:02 AM", "3/12/2020 10:11:24 AM", "3/12/2020 10:12:22 AM", 
 "3/12/2020 10:12:34 AM", "3/12/2020 11:20:33 AM", "3/12/2020 11:20:37 AM", 
"3/12/2020 11:21:08 AM", "3/12/2020 11:21:09 AM", "3/12/2020 12:01:13 PM", 
"3/12/2020 12:04:02 PM", "3/12/2020 2:00:10 PM", "3/12/2020 2:04:51 PM", 
 "3/12/2020 2:04:57 PM", "3/12/2020 2:04:58 PM", "3/12/2020 2:50:24 PM", 
 "3/12/2020 2:50:46 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
  -46L))

Я пробовал это : Талантливый участник из Stack помог мне, и это прекрасно работает, за исключением моего большого набора данных, у меня есть случаи, когда некоторые даты не записываются:

  df2<-df %>%
   mutate(Time1 = mdy_hms(Time)) %>%
   group_by(grp = cumsum(Action == 'Connect')) %>% 
   mutate(Diff = difftime(Time1, lag(Time1), unit = 'sec'),
     Diff = case_when(any(Diff <=60) ~ 60, TRUE ~ as.numeric(Diff))) %>%
  filter(Action == 'Connect'|Diff >60) %>%
  ungroup %>% 
  filter(!duplicated(rleid(Action))) %>% 
  select(Action, Time)


 library(data.table)
   df %>% 
 mutate(rn = rowid(Action)) %>% 
 pivot_wider(names_from = Action, values_from = Date) %>%
 select(-rn)

Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...