Вот решение с использованием for
петель.
Данные:
df <- data.frame(policy = c(1,1,1,2,2,2),
income = c(50,50,50,70,70,70),
expense = c(250,35,35,600,50,50),
rate = c(2,2,2,3,3,3))
Сначала мы разбиваем данные на policy
для группировки:
dftemp <- split(df, df$policy)
Затем мы инициализируем список для наших результатов и заполняем векторы в списке NA
, чтобы избежать их увеличения в цикле:
resulttemp <- vector("list", length(dftemp))
for(i in 1:length(resulttemp)){
resulttemp[[i]] <- rep(NA, nrow(dftemp[[i]]))
}
Теперь мы перебираем разделенные данные, чтобы получить наши результаты:
for(i in 1:length(dftemp)){
for(j in 1:nrow(dftemp[[i]])){
if(j == 1){
resulttemp[[i]][j] <- dftemp[[i]]$expense[j]/dftemp[[i]]$rate[j]-dftemp[[i]]$income[j]
}else{
resulttemp[[i]][j] <- (resulttemp[[i]][j-1]+dftemp[[i]]$expense[j])/dftemp[[i]]$rate[j]-dftemp[[i]]$income[j]
}
}
}
После этого мы unlist
получаем наши результаты и добавляем их к исходным данным:
df$result <- unlist(resulttemp)
df
policy income expense rate result
1 1 50 250 2 75.00000
2 1 50 35 2 5.00000
3 1 50 35 2 -30.00000
4 2 70 600 3 130.00000
5 2 70 50 3 -10.00000
6 2 70 50 3 -56.66667
Обратите внимание, что исходные данные должны быть упорядочены группой перед разделением!