如何计算变量超出其阈值的次数。忽略连续事件

时间:2019-01-15 07:19:32

标签: r dplyr

我必须找出一个变量每10分钟超过其阈值的时间。在下面,变量Threshold Event表示0或1。 1表示超出阈值,而0表示正常。

可变的是汽车速度,因此,如果其超过极限(例如35 kmph),它将在一段时间内再次保持在该极限之上,然后速度再次降至正常(0)。因此,我需要排除此类连续事件,并且每次超过该限制时仅将其计为一次。

有人可以帮忙吗?。我尝试使用var cars1 = [ {id: 1, make: "Ford", model: "F150", year: 2002}, {id: 3, make: "Chevy", model: "Tahoe", year: 2003}, ]; var cars2 = [ {id: 2, make: "Kia", model: "Optima", year: 2001}, {id: 4, make: "Nissan", model: "Sentra", year: 1982}, ]; const cars1IDs = new Set(cars1.map(({ id }) => id)); const combined = [ ...cars1, ...cars2.filter(({ id }) => !cars1IDs.has(id)) .map(({ id, make }) => ({ id, make, type: 'car' })) ]; combined.sort((a, b) => a.id - b.id); console.log(combined);过滤条件并将其置于阈值附近,但是我无法成功。

样本数据

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    

2 个答案:

答案 0 :(得分:1)

如果要从第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'))

答案 1 :(得分:1)

我们可以将group_by列中的CAR_ID cutTimestamp分为“每10分钟”的组,并计算值超过Threshold的次数分别使用rle(不包括连续的小肠)。

library(dplyr)

df %>%
  group_by(CAR_ID, group = cut(Timestamp, breaks = "10 mins")) %>%
  summarise(Count = sum(with(rle(Threshold), values == 1)))

确保Timestamp列属于datetimePOSIXct类,而不是字符串。