Я хочу сгруппировать вектор, основанный на сумме элементов, которые меньше или равно n
. Предположим, что
set.seed(1)
x <- sample(10, 20, replace = TRUE)
#[1] 3 4 6 10 3 9 10 7 7 1 3 2 7 4 8 5 8 10 4 8
#Where,
n = 15
Ожидаемый результат будет состоять из групповых значений, тогда как их сумма равна <= 15, т.е.
y <- c(1, 1, 1, 2, 2, 3, 4, 5 ,5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10)
Как вы можете видеть, сумма не превышает 15,
sapply(split(x, y), sum)
# 1 2 3 4 5 6 7 8 9 10
#13 13 9 10 15 12 12 13 14 8
ПРИМЕЧАНИЕ. Я буду использовать это на огромных наборах данных (обычно > 150 - 200 ГБ), поэтому эффективность является обязательной.
Метод, который я пытался и близился, но не работает,
as.integer(cut(cumsum(x), breaks = seq(0, max(cumsum(x)) + 15, 15)))
#[1] 1 1 1 2 2 3 3 4 4 4 5 5 5 6 6 6 7 8 8 8