Сгруппировать, взять длительность и установить условие в пределах R (dplyr, r) - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть набор данных, df: (набор данных содержит более 4000 строк)

  DATEB

  9/9/2019 7:51:58 PM
  9/9/2019 7:51:59 PM
  9/9/2019 7:51:59 PM
  9/9/2019 7:52:00 PM
  9/9/2019 7:52:01 PM
  9/9/2019 7:52:01 PM
  9/9/2019 7:52:02 PM
  9/9/2019 7:52:03 PM
  9/9/2019 7:54:00 PM
  9/9/2019 7:54:02 PM
  9/10/2019 8:00:00PM

Я хочу поместить их в отдельные группы и взять длительность, если время между датой и временем превышает 120 секунд.

Желаемый вывод:

Group   Duration

 a       5 sec
 b       2 sec
 c       0 sec




 dput:


  structure(list(DATEB = structure(c(2L, 3L, 3L, 4L, 5L, 5L, 6L, 
  7L, 8L, 9L, 1L), .Label = c("      9/10/2019 8:00:00 PM", "      9/9/2019 7:51:58 PM", 
  "      9/9/2019 7:51:59 PM", "      9/9/2019 7:52:00 PM", "      9/9/2019 7:52:01 PM", 
  "      9/9/2019 7:52:02 PM", "      9/9/2019 7:52:03 PM", "      9/9/2019 7:54:00 PM", 
  "      9/9/2019 7:54:02 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
  -11L))

Я попробовал приведенный ниже код, который работает хорошо, за исключением того, что я хочу, чтобы 7:51:59 и 7:52:00 были в той же группе. Единственный раз, когда продолжительность должна прерваться и создать новую группу, это когда время между датами превышает 120 секунд.

   df %>%
   mutate(DATEB = lubridate::mdy_hms(DATEB), 
   temp = floor_date(DATEB, "120 secs")) %>%
   group_by(temp) %>%
   summarise(duration = difftime(max(DATEB), min(DATEB), units = "secs"))

Любое предложение приветствуется.

Ответы [ 2 ]

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

Мы можем использовать cut здесь:

library(dplyr)
df %>%
  mutate(DATEB = lubridate::mdy_hms(DATEB), 
        temp = cut(DATEB, breaks = "2 mins")) %>%
  group_by(temp) %>%
  summarise(duration = difftime(max(DATEB), min(DATEB), units = "secs"))

# A tibble: 3 x 2
#  temp                duration
#  <fct>               <drtn>  
#1 2019-09-09 19:51:00 5 secs  
#2 2019-09-09 19:53:00 2 secs  
#3 2019-09-10 19:59:00 0 secs  
1 голос
/ 04 февраля 2020

ОП запросил:

Единственный раз, когда длительность должна прерваться и создать новую группу, это когда время между датами превышает 120 секунд.

Слова " время между датами " предполагают, что ОП ищет разрыв или паузу . (Ну, это то, что я искал бы, если бы мне дали вектор упорядоченных дат и поручить сгруппировать данные.)

К сожалению, ожидаемый результат и принятый ответ не соответствуют это толкование.

Однако вот что я хотел бы сделать:

gap_threshold <- 10
df %>%
  mutate(DATEB = lubridate::mdy_hms(DATEB), 
         gap = c(0, diff(DATEB))) %>% 
  group_by(grp = cumsum(gap > gap_threshold)) %>% 
  summarise(begin = min(DATEB), end = max(DATEB), duration = difftime(end, begin, units = "secs"))
# A tibble: 3 x 4
    grp begin               end                 duration
  <int> <dttm>              <dttm>              <drtn>  
1     0 2019-09-09 19:51:58 2019-09-09 19:52:03 5 secs  
2     1 2019-09-09 19:54:00 2019-09-09 19:54:02 2 secs  
3     2 2019-09-10 20:00:00 2019-09-10 20:00:00 0 secs
...