如何在R中聚合关闭时间事件

我需要能够使用事件的数据框,并输出运行的开始,结束和计数,其中运行是事件小于指定时间段的地方.

data.frame行已按时间排序

例如

library(lubridate)

ts <- c("2016-10-28 19:21:19",
        "2016-10-28 19:21:20",
        "2016-10-28 19:21:21",
        "2016-10-28 19:21:21",
        "2016-10-28 19:23:23",
        "2016-10-28 19:23:24",
        "2016-10-28 19:23:24",
        "2016-10-28 19:23:25",
        "2016-10-30 03:59:09",
        "2016-10-30 08:54:31",
        "2016-10-30 08:54:35"
)

df  <- data.frame(time=ymd_hms(ts))

我想输出的是这样的数据帧,其间隔是从前一个事件开始的60秒

start                end                  count
2016-10-28 19:21:19  2016-10-28 19:21:21  4 
2016-10-28 19:23:23  2016-10-28 19:23:25  4
2016-10-30 03:59:09  2016-10-30 03:59:09  1
2016-10-30 08:54:31  2016-10-30 08:54:35  2

实际的序列会非常长,因此解决方案需要在很多(~100k)行中表现良好

我看过lag,diff和其他函数,但是看不到一种简单有效的方法.

最佳答案 这是使用dplyr的代码.

首先,它按时间排序,以防它们出现故障.然后,它使用difftime计算timeChange以确保它以秒为单位返回并确定它是否为BigChange(此处,大于60秒).然后,它使用每个TRUE使用cumsum递增组号(将每个TRUE计为1).然后group_bys该组,并计算您想要的摘要.

df %>%
  arrange(time) %>%
  mutate(timeChange = difftime(time, lag(time, default = time[1])
                               , units = "secs")
         , isBigChange = timeChange > 60
         , group = cumsum(isBigChange)) %>%
  group_by(group) %>%
  summarise(
    start = min(time)
    , end = max(time)
    , count = n()
  )

返回

  group               start                 end count
  <int>              <dttm>              <dttm> <int>
1     0 2016-10-28 19:21:19 2016-10-28 19:21:21     4
2     1 2016-10-28 19:23:23 2016-10-28 19:23:25     4
3     2 2016-10-30 03:59:09 2016-10-30 03:59:09     1
4     3 2016-10-30 08:54:31 2016-10-30 08:54:35     2
点赞