Это лучшее, что я мог придумать. Но было бы здорово, если бы у кого-то было более элегантное решение:
df_in <- data.frame(seq = c(2004L, 2005L, 2007L, 2008L, 2014L, 2015L, 2016L))
Определить максимальное расстояние между элементами в группе:
max_range_within_group <- 1
Рассчитать существующее расстояния:
diffs <- df_in$seq[-1] - df_in$seq[-length(df_in$seq)]
Итерируйте расстояния между желобами и проверьте, находятся ли они в пределах «разрешенного» расстояния, или увеличьте grp на 1:
grp <- 1
for (diff in diffs) {
nextGrp <- if (diff <= max_range_within_group) {
grp[length(grp)]
} else {
grp[length(grp)] + 1
}
grp <- c(grp, nextGrp)
}
Привязка grp
к data.frame:
df_in$grp <- grp
Возвращает:
seq grp
1 2004 1
2 2005 1
3 2007 2
4 2008 2
5 2014 3
6 2015 3
7 2016 3