Используйте R для создания столбцов времени начала и окончания, основываясь на первом появлении событий в другом столбце. - PullRequest
0 голосов
/ 08 февраля 2020

Мне было интересно, как синтезировать начальное и конечное время, например, из приведенного ниже кадра данных. Данные показывают запись обработчика вызова за период времени, когда выполняются вызовы

Id  CallTime    CallHandler CallStatus
1   01/01/2020 00:05    A   Busy
2   01/01/2020 00:10    A   Free
3   01/01/2020 00:25    A   Free
4   01/01/2020 00:57    A   Free
5   01/01/2020 01:30    A   Busy
6   01/01/2020 01:45    A   Busy
7   01/01/2020 02:20    A   Busy
8   01/01/2020 02:25    A   Busy
9   01/01/2020 02:50    A   Free
10  01/01/2020 02:25    A   Free
11  01/01/2020 02:55    A   Busy
12  01/01/2020 03:25    A   Busy
13  01/01/2020 04:55    A   Free
14  01/01/2020 05:25    A   Busy
15  01/01/2020 05:55    A   Free
16  01/01/2020 06:25    A   Busy

Ожидаемый вывод

Выходные данные должны возвращать время начала и окончания в разных столбцах в зависимости от состояния занятости и свободного вызова Свободен и занят


CallHandler StartTime   EndTime
A   01/01/2020 00:05    01/01/2020 00:10
A   01/01/2020 01:30    01/01/2020 02:50
A   01/01/2020 02:55    01/01/2020 04:55
A   01/01/2020 05:25    01/01/2020 05:55
A   01/01/2020 06:25    N/A

Я использовал

df %>%
  group_by(CallStatus) %>%
  mutate(StartTime = ifelse(CallStatus == "Free", CallTime, 0), EndTime = ifelse(CallStatus == "Busy", CallTime, 0))

Чтобы получить следующее, но Нит действительно то, что я хотел

Id      CallTime         CallHandler CallStatus StartTime        EndTime               
1       01/01/2020 00:05 A           Busy       0                01/01/2020 00:05
2       01/01/2020 00:10 A           Free       01/01/2020 00:10 0               
3       01/01/2020 00:25 A           Free       01/01/2020 00:25 0               
4       01/01/2020 00:57 A           Free       01/01/2020 00:57 0               
5       01/01/2020 01:30 A           Busy       0                01/01/2020 01:30
6       01/01/2020 01:45 A           Busy       0                01/01/2020 01:45
7       01/01/2020 02:20 A           Busy       0                01/01/2020 02:20
8       01/01/2020 02:25 A           Busy       0                01/01/2020 02:25
9       01/01/2020 02:50 A           Free       01/01/2020 02:50 0               
10      01/01/2020 02:25 A           Free       01/01/2020 02:25 0               
11      01/01/2020 02:55 A           Busy       0                01/01/2020 02:55
12      01/01/2020 03:25 A           Busy       0                01/01/2020 03:25
13      01/01/2020 04:55 A           Free       01/01/2020 04:55 0               
14      01/01/2020 05:25 A           Busy       0                01/01/2020 05:25
15      01/01/2020 05:55 A           Free       01/01/2020 05:55 0               
16      01/01/2020 06:25 A           Busy       0                01/01/2020 06:25

1 Ответ

0 голосов
/ 08 февраля 2020

Мы можем сначала filter из строк, где CallStatus равно "Busy" или предыдущее значение CallStatus равно "Busy", создать их группы и выбрать записи first и last в каждой группе. Мы заменяем EndTime на NA, когда StartTime и EndTime совпадают.

library(dplyr)

df %>%
  filter(CallStatus == "Busy" | lag(CallStatus) == "Busy") %>%
  group_by(CallHandler, gr = cumsum(lag(CallStatus != "Busy", default = TRUE))) %>%
  summarise(StartTime = first(CallTime), 
            EndTime = last(CallTime)) %>%
  mutate(EndTime = replace(EndTime, StartTime == EndTime, NA)) %>%
  select(-gr)


# CallHandler StartTime         EndTime        
# <fct>       <fct>             <fct>          
#1 A           01/01/2020 00:05 01/01/2020 00:10
#2 A           01/01/2020 01:30 01/01/2020 02:50
#3 A           01/01/2020 02:55 01/01/2020 04:55
#4 A           01/01/2020 05:25 01/01/2020 05:55
#5 A           01/01/2020 06:25 NA             
...