Я нашел решение, используя rle
, fill
и mutate
.
Сначала создали вашу отправную точку:
library(tidyr)
library(dplyr)
SB <- c(1,1,1,0,1,1)
df <- data.frame(SB)
Затем добавили SB_count
, используя rle
. Мне также нужно было run
число, чтобы потом сгруппировать:
df$SB_count <- sequence(rle(df$SB)$lengths)
df$SB_count[df$SB == 0] <- 0
nstarts <- length(df$SB_count[df$SB_count == 1])
df$run[df$SB_count == 1] <- 1:nstarts
df <- fill(df, run)
df <- df[,c(3,1:2)]
Наконец, группируем по run
и добавляем значение max
:
df <- df %>% group_by(run) %>%
mutate(SB_bout = max(SB_count))
df$run[df$SB == 0] <- 0
df$SB_bout[df$SB == 0] <- 0
Это дает следующий вывод:
run SB SB_count SB_bout
<dbl> <dbl> <dbl> <dbl>
1 1 1 1 3
2 1 1 2 3
3 1 1 3 3
4 0 0 0 0
5 2 1 1 2
6 2 1 2 2
Единственное отличие от вашего в том, что я показываю максимум SB_bout
в каждом ряду этого run
.