我需要有一个带有事件的数据框,并输出运行的开始,结束和计数,其中运行是事件小于指定时间段的地方。
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)行才能很好地执行
我查看了lag
,diff
和其他功能,但看不到一种简单有效的方法。
答案 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()
)