Это может работать:
Мы инициируем накопительную сумму j
, начиная с 0
, групповое значение k
, начиная с 1
и групповой вектор w
, установленный наNA
с длиной = length(v)
.
j <- 0
k <- 1
w <- rep(NA, length(v))
Теперь мы зациклимся на i = 1:length(v)
, установив значение группировки k
в векторе группы w
в позиции i
, добавим текущее значениеот v[i]
до j
и сложите k
, когда j
равно >= 50
, сброс j
на 0
.Если последняя группа не заполняет до 50, сбросьте все значения последней группы в векторе группировки w
на значение k-1
:
for(i in 1:length(v)){
w[i] <- k
j <- j + v[i]
if(i == length(v) & j < 50){
w[w == k] <- k-1
}
if(j >= 50){
k <- k + 1
j <- 0
}
}
Пример:
v = c(3, 23, 224, 124, 49, 17, 3, 8, 12)
> w
[1] 1 1 1 2 3 3 3 3 3
df <- cbind.data.frame(v, w)
v w
1 3 1
2 23 1
3 224 1
4 124 2
5 49 3
6 17 3
7 3 3
8 8 3
9 12 3
Теперь мы можем aggregate
над группой, чтобы получить кумулятивные суммы:
aggregate(v ~ w, df, sum)
w v
1 1 250
2 2 124
3 3 89