折叠从0到0的行

时间:2019-01-29 16:33:34

标签: r dplyr tidyr collapse

对于这样的数据集

    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))

我正在使用mutate函数通过id计算时间的滚动差异

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 个答案:

答案 0 :(得分:3)

group_by属性保留在mutate之后,因此我们按组summarise获取“日期”的minmax和通过paste将元素放在一起来折叠“产品”(toStringpaste(., 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