R: Определите столбец, в котором первая запись является вычислением из другого столбца, а последующие записи обновляются с использованием предыдущих записей из того же столбца. - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу создать столбец 'result' так, чтобы

df <- policy income expense rate result
1      1      50     250     2     75  (250/2-50)
2      1      50     35      2     05  ((75+35)/2-50)
3      1      50     35      2    -30  ((5+35)/2-50)
4      2      70     600     3    130  (600/3-70)
5      2      70     50      3    -10  ((130+50)/3-70)
6      2      70     50      3   -56.6 ((-10+50)/3-70)

Кадр данных был сгруппирован, из-за чего я не могу повторить логику для первой записи для каждой группы.Подскажите пожалуйста как мне этого добиться

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 07 декабря 2018

Вот решение с использованием 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

Обратите внимание, что исходные данные должны быть упорядочены группой перед разделением!

...