如何在R

时间:2016-10-31 14:27:02

标签: r

我需要有一个带有事件的数据框,并输出运行的开始,结束和计数,其中运行是事件小于指定时间段的地方。

data.frame行已按时间排序

e.g。

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)行才能很好地执行

我查看了lagdiff和其他功能,但看不到一种简单有效的方法。

1 个答案:

答案 0 :(得分:2)

以下是使用~/.emacs的代码。

首先,它按dplyr进行排序,以防它们出现故障。然后,它使用time计算timeChange以确保它以秒为单位返回并确定它是否difftime(此处,大于60秒)。然后,它使用每个isBigChange使用TRUE递增组号(将每个cumsum计为1)。然后TRUE表示group_by,并计算您想要的摘要。

group

返回

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