Создайте новый раздел и возьмите разницу во времени, если время превышает определенное количество (R, Dplyr) - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть набор данных, df, который имеет 10000 строк:

DateA

9/9/2019 7:52:16 PM
9/9/2019 7:52:16 PM
9/9/2019 7:52:17 PM
9/9/2019 7:52:18 PM
9/9/2019 7:52:18 PM
9/9/2019 7:52:19 PM
9/10/2019 1:02:23 AM
9/10/2019 1:02:25 AM
9/10/2019 1:02:26 AM
9/10/2019 1:02:27 AM
9/10/2019 1:02:27 AM
9/10/2019 1:02:29 AM
9/10/2019 1:02:29 AM
9/10/2019 1:03:29 AM    
9/10/2019 1:03:29 AM    
9/10/2019 1:03:31 AM    
9/10/2019 1:03:32 AM    
9/10/2019 4:18:48 AM    
9/10/2019 4:18:50 AM    
9/10/2019 4:18:51 AM    

Я хотел бы получить такой вывод:

Group   Duration

 a       3 sec
 b       6 sec
 c       3 sec
 d       3 sec

Я хотел бы установить три sh до 1 мин или 60 сек c. Если обнаружен промежуток времени более 60 секунд, будет создана новая группа вместе с ее продолжительностью.

dput:

 structure(list(DateA = structure(c(12L, 12L, 13L, 14L, 14L,   15L, 
 1L, 2L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 8L, 9L, 10L, 11L),      .Label = c("9/10/2019 1:02:23 AM", 
"9/10/2019 1:02:25 AM", "9/10/2019 1:02:26 AM", "9/10/2019   1:02:27 AM", 
"9/10/2019 1:02:29 AM", "9/10/2019 1:03:29 AM", "9/10/2019 1:03:31 AM", 
"9/10/2019 1:03:32 AM", "9/10/2019 4:18:48 AM", "9/10/2019 4:18:50 AM", 
"9/10/2019 4:18:51 AM", "9/9/2019 7:52:16 PM", "9/9/2019 7:52:17 PM", 
"9/9/2019 7:52:18 PM", "9/9/2019 7:52:19 PM"), class =  "factor")), class =   "data.frame", row.names = c(NA, 
 -20L))

Я пытался:

 thresh1 <-60

 library(data.table)
 setDT(df)[, DateA := as.ITime(as.character(DateA))][, 
  .(Duration = difftime(max(as.POSIXct(DateA)),         min(as.POSIXct(DateA)), 
   unit = 'sec')),.(group = letters[cumsum(c(TRUE, diff(DateA) >     thresh1))])]

Однако я делаю что-то не так, потому что получаю вывод только из 1 строки.

  group  Duration

   a       0

Не уверен, что я делаю неправильно? Любое предложение приветствуется.

1 Ответ

2 голосов
/ 04 февраля 2020

Мы можем преобразовать DateA в POSIXct класс, format, чтобы он включал информацию только с точностью до минуты и нашел разницу между продолжительностью max и min в каждой группе.

library(dplyr)

df %>%
  mutate(DateA = lubridate::dmy_hms(DateA), 
         temp = format(DateA, "%Y-%m-%d %H:%M")) %>%
  group_by(temp) %>%
  summarise(duration = difftime(max(DateA), min(DateA), units = "secs"))

# A tibble: 4 x 2
#  temp             duration
#  <chr>            <drtn>  
#1 2019-09-09 19:52 3 secs  
#2 2019-10-09 01:02 6 secs  
#3 2019-10-09 01:03 3 secs  
#4 2019-10-09 04:18 3 secs  
...