Предполагая, что gen
всегда увеличивается, мы можем использовать diff
и cumsum
df$animal <- cumsum(c(TRUE, diff(df$gen) < 0))
df
# gen animal
#1 1 1
#2 1 1
#3 2 1
#4 3 1
#5 4 1
#6 5 1
#7 1 2
#8 1 2
#9 1 2
#10 2 2
#11 2 2
#12 2 2
#13 3 2
#14 3 2
#15 4 2
#16 5 2
#17 1 3
#18 2 3
#19 3 3
#20 3 3
#21 4 3
#22 5 3
Или использовать dplyr
с lag
+ cumsum
library(dplyr)
df %>% mutate(animal = cumsum(lag(gen, default = 5) == 5 & gen == 1))
данные
df <- structure(list(gen = c(1L, 1L, 2L, 3L, 4L, 5L, 1L, 1L, 1L, 2L,
2L, 2L, 3L, 3L, 4L, 5L, 1L, 2L, 3L, 3L, 4L, 5L)), class = "data.frame",
row.names = c(NA, -22L))