Свернуть строки от 0 до 0

Для такого набора данных

    Incident.ID..                date           product
    INCFI0000029582     2014-09-25 08:39:45     foo
    INCFI0000029582     2014-09-25 08:39:48     bar 
    INCFI0000029582     2014-09-25 08:40:44     foo
    INCFI0000029582     2014-10-10 23:04:00     foo
    INCFI0000029587     2014-09-25 08:33:32     bar
    INCFI0000029587     2014-09-25 08:34:41     bar
    INCFI0000029587     2014-09-25 08:35:24     bar
    INCFI0000029587     2014-10-10 23:04:00     foo


df <- structure(list(Incident.ID.. = c("INCFI0000029582", "INCFI0000029582", 
"INCFI0000029582", "INCFI0000029582", "INCFI0000029587", "INCFI0000029587", 
"INCFI0000029587", "INCFI0000029587"), date = c("2014-09-25 08:39:45", 
"2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-10-10 23:04:00", 
"2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24", 
"2014-10-10 23:04:00"), product = 
c("foo","bar","foo","foo","bar","bar","bar","foo")), 
class = "data.frame", row.names = c(NA, 
-8L))

Я рассчитываю скользящую разницу во времени по id с помощью функции mutate следующим образом

library(dplyr)
library(lubridate)
df1 <- df %>%
  group_by(Incident.ID..) %>%
  mutate(diff = c(0, diff(ymd_hms(date))))

Это создает столбец diff следующее

  Incident.ID..   date                 product    diff
  INCFI0000029582 2014-09-25 08:39:45  foo        0
  INCFI0000029582 2014-09-25 08:39:48  bar        3
  INCFI0000029582 2014-09-25 08:40:44  foo        56
  INCFI0000029582 2014-10-10 23:04:00  foo        1347796
  INCFI0000029587 2014-09-25 08:33:32  bar        0
  INCFI0000029587 2014-09-25 08:34:41  bar        69
  INCFI0000029587 2014-09-25 08:35:24  bar        43
  INCFI0000029587 2014-10-10 23:04:00  foo        1348116

Теперь моя цель - объединить / свернуть строки от нуля до нуля с ожидаемым окончательным набором данных, подобным этому

 Incident.ID..     DateMin              DateMax              product
 INCFI0000029582   2014-09-25 08:39:45  2014-10-10 23:04:00  foo,bar,foo,foo
 INCFI0000029587   2014-09-25 08:33:32  2014-10-10 23:04:00  bar,bar,bar,foo

Я не уверен, как свернуть строки, как показано выше, с минимальной и максимальной датой столбца, мне нужна помощь. Заранее спасибо.

1 ответ

Решение

group_by атрибут остается после mutateпоэтому мы summarise группой, чтобы получить min, max "даты" и свернуть "продукт" pasteобъединение элементов (toString удобная обертка для paste(., collapse=", "))

df %>%
   group_by(Incident.ID..) %>%
   mutate(diff = c(0, diff(ymd_hms(date)))) %>% 
   summarise(DateMin = min(date), 
             DateMax = max(date), 
             product = toString(product))
# A tibble: 2 x 4
#  Incident.ID..   DateMin             DateMax             product           
#  <chr>           <chr>               <chr>               <chr>             
#1 INCFI0000029582 2014-09-25 08:39:45 2014-10-10 23:04:00 foo, bar, foo, foo
#2 INCFI0000029587 2014-09-25 08:33:32 2014-10-10 23:04:00 bar, bar, bar, foo
Другие вопросы по тегам