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