r语言 - 如何计算变量超过其阈值的次数.忽略连续事件



我必须找出变量每 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列属于datetimePOSIXct类,而不是字符串。

如果你想从

第 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'))

相关内容

最新更新