Функция, представленная ниже, группирует значения в векторе на основе того, достигла ли накопленная сумма определенного максимального значения, а затем начала заново.
cs_group <- function(x, threshold) {
cumsum <- 0
group <- 1
result <- numeric()
for (i in 1:length(x)) {
cumsum <- cumsum + x[i]
if (cumsum > threshold) {
group <- group + 1
cumsum <- x[i]
}
result = c(result, group)
}
return (result)
}
Пример
Максимальное значение в примере - 10. Первая группа включала только 9; потому что суммирование его со следующим значением приведет к сумме 12. Следующая группа включает 3, 2, 2 (+8 приведет к значению больше 10).
test <- c(9, 3, 2, 2, 8, 5, 4, 9, 1)
cs_group(test, 10)
[1] 1 2 2 2 3 4 4 5 5
Однако я предпочитаю включить в каждую группу значение, в результате которого совокупная сумма будет превышать максимальное значение 10.
Идеальный результат:
[1] 1 1 2 2 2 3 3 3 4