Найти метку для каждой группы, заданную временной последовательностью - PullRequest
0 голосов
/ 29 марта 2019

Я хотел бы создать новый столбец в моем фрейме данных на основе события (поэтому только строки с event == 1 группируются по нерегулярному индексу времени t. Дело в том, что event происходит впоследовательность, а не в определенном timerange. По сути, я хочу, чтобы каждая последовательность event == 1 получала свою метку group.

x = c(10, 9 ,8,8,8,5,4,3,3,3,3,3,3,4,5,6,7,8,12)
event = c(0,0,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0)
t = 1:length(x)
df = data.frame(x, event,t)

То, что я хотел бы получить, это что-то вроде нового столбца group. Основная проблема заключается в том, что в моей последовательности я заранее не знаю, сколько будет «подпоследовательностей с event == 1» или как долго они будут.

Это то, что я хотел бы иметь какокончательный результат:

group = c(0,0,1,1,1,0,0,2,2,2,2,2,2,0,0,0,0,0,0)
data.frame(df, group)

1 Ответ

2 голосов
/ 29 марта 2019

Возможно не очень читабельно ...

library("tidyverse")

x = c(10, 9 ,8,8,8,5,4,3,3,3,3,3,3,4,5,6,7,8,12)
event = c(0,0,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0)
t = 1:length(x)
df = data.frame(x, event,t)

df %>%
  # `cumsum` detects the start of a new event (a switch from 0 to 1)
  mutate(group = event * cumsum((event == 1 & lag(event, default = 0) == 0)))
#>     x event  t group
#> 1  10     0  1     0
#> 2   9     0  2     0
#> 3   8     1  3     1
#> 4   8     1  4     1
#> 5   8     1  5     1
#> 6   5     0  6     0
#> 7   4     0  7     0
#> 8   3     1  8     2
#> 9   3     1  9     2
#> 10  3     1 10     2
#> 11  3     1 11     2
#> 12  3     1 12     2
#> 13  3     1 13     2
#> 14  4     0 14     0
#> 15  5     0 15     0
#> 16  6     0 16     0
#> 17  7     0 17     0
#> 18  8     0 18     0
#> 19 12     0 19     0

Создано в 2019-03-28 пакетом представ. (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...