我必须找出变量每 10 分钟超过其阈值的时间。在下面 变量阈值事件表示 0 或 1 。1 表示它超过了其阈值,而 0 表示正常。
变量是车速,所以如果超过限制(比如 35 公里/小时),它将继续保持在该限制以上一段时间,直到速度再次下降到正常水平 (0)。 所以我需要排除此类连续事件,并且每次超过该限制时只将其计为一次。
有人可以帮忙吗..我尝试用dplyr
过滤并在阈值附近设置条件,但我无法成功。
示例数据
Timestamp Speed Threshold
1 2014-04-03 09:23:57 30.07929 0
2 2014-04-03 09:23:55 35.63192 1
3 2014-04-03 09:23:59 34.92283 0
. .
. .
4 2014-04-03 09:33:01 37.30859 1
5 2014-04-03 09:33:02 38.58576 1
6 2014-04-03 09:33:03 39.51970 1
7 2014-04-03 09:33:04 38.02424 1
8 2014-04-03 09:33:05 33.12697 0
9 2014-04-03 09:33:39 30.21950 0
10 2014-04-03 09:33:40 31.27000 0
11 2014-04-03 09:33:41 32.00667 1
12 2014-04-03 09:33:42 32.94374 1
13 2014-04-03 09:33:43 33.25141 1
14 2014-04-03 09:33:44 32.76980 1
15 2014-04-03 09:33:45 30.11010 0
16 2014-04-03 09:33:56 31.63525 0
17 2014-04-03 09:33:57 34.61222 0
18 2014-04-03 09:33:58 37.52020 1
19 2014-04-03 09:33:59 40.48424 1
20 2014-04-03 09:34:00 43.43828 0
............
输出应如下所示
CAR ID Time (Sec) Count
XXXX 2014-04-03 09:23:00 1
xxxx 2014-04-03 09:33:00 3
. . .
. . .
我们可以group_by
CAR_ID
cut
Timestamp
列分成每"10分钟"一组,并使用rle
单独计算该值超过Threshold
的次数(不包括连续输入)。
library(dplyr)
df %>%
group_by(CAR_ID, group = cut(Timestamp, breaks = "10 mins")) %>%
summarise(Count = sum(with(rle(Threshold), values == 1)))
确保Timestamp
列属于datetime
或POSIXct
类,而不是字符串。
第 3 分钟开始每 10 分钟分组一次,你可以这样做:
library(tidyverse)
library(lubridate)
df %>%
group_by(Timestamp = str_sub(ymd_hms(Timestamp) - minutes(3), 1, 15)) %>%
summarise(Count = sum(Treshhold)) %>%
mutate(Timestamp = str_c(Timestamp, '3'))