Как посчитать, сколько раз переменная превысила свой порог. Игнорировать последовательные события - PullRequest
0 голосов
/ 15 января 2019

Я должен выяснить, сколько раз переменная превышала свой порог каждые 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
.                         .                     .
.                         .                     .

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Мы можем group_by CAR_ID и cut столбец Timestamp группировать каждые 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 относится к классу datetime или POSIXct, а не к строке.

0 голосов
/ 15 января 2019

Если вы хотите сгруппировать его каждые 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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...