Вы можете попробовать указать группы для каждого ряда.Простой способ - найти точку изменения.Для этого просто вычислите разницу между записями i
и i + 1
и возьмите абсолютное значение.После этого вам нужно всего лишь использовать функцию cumsum
для создания идентификатора для каждой группы:
my_column = matrix(c(1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0))
new_column <- abs(c(0, my_column[-length(my_column)] - my_column[-1]))
groups <- cumsum(new_column)
my_mat <- cbind(original = my_column, new_column = new_column, group = groups)
> my_mat
new_column group
[1,] 1 0 0
[2,] 1 0 0
[3,] 1 0 0
[4,] 1 0 0
[5,] 1 0 0
[6,] 0 1 1
[7,] 0 0 1
[8,] 0 0 1
[9,] 0 0 1
[10,] 1 1 2
[11,] 1 0 2
[12,] 1 0 2
[13,] 0 1 3
[14,] 0 0 3
[15,] 0 0 3
[16,] 0 0 3
[17,] 0 0 3
[18,] 1 1 4
[19,] 1 0 4
[20,] 1 0 4
[21,] 1 0 4
[22,] 1 0 4
[23,] 1 0 4
[24,] 0 1 5
[25,] 0 0 5
[26,] 0 0 5
Теперь у вас есть все, что вам нужно.
РЕДАКТИРОВАТЬ:
Для подсчета количества групп, которые вы можете сделать:
library(dplyr)
my_df <- data.frame(original = my_column, new_column = new_column, group = groups)
my_df %>% group_by(original) %>% summarise(n_groups = n_distinct(group))
# A tibble: 2 x 2
original n_groups
<dbl> <int>
1 0 3
2 1 3