Вычисление суммы определенных строк в одном data.frame - PullRequest
1 голос
/ 20 января 2020

У меня есть data.frame, называемый "тест", подобный этому:

   Age START_DATE   END_DATE ACCT_NO PRINCIPAL_AMOUNT_BASE
1   60 01/05/2014 30/06/2014    ACC1                   400
2  121 01/03/2014 30/06/2014    ACC2                   200
3  121 01/03/2014 30/06/2014    ACC3                   300
4  180 01/01/2014 30/06/2014    ACC4                   100
5  183 01/07/2014 31/12/2014    ACC5                   200
6  914 01/07/2014 31/12/2016    ACC6                   300
7  914 01/07/2014 31/12/2016    ACC7                   500
8 1644 01/07/2014 31/12/2018    ACC8                    50

Я пытаюсь получить список сумм для PRINCIPAL_AMOUNT_BASE между каждой учетной записью, у которой дата начала = предыдущая учетная запись с датой окончания + 1. Например: acc1 имеет дату окончания 30/06/2014, а acc5 имеет дату начала 01/07/2014 => 400 + 200 = 600. Также дату начала каждой строки можно использовать только один раз (следующая сумма будет между acc2 и acc6, а не acc2 и acc5).

Вот мой код:

visited <- vector()
num_list <-vector()

for (i in 1:nrow(test)){
  for (z in i+1:nrow(test)){
    if ((test[i, 3] + 1) == test[z,2]){
        if (z %in% visited){
          next
        } else {
          result <- test[i,5] + test[z,5]
          num_list <- c(num_list, result)
          visited <- c(visited, z)
          print (result)
          break
        }
    }
  } 
}

Я получаю эту ошибку:

Error in if ((test[i, 3] + 1) == test[z, 2]) { : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In Ops.factor(test[i, 3], 1) : ‘+’ not meaningful for factors

Я ожидаю, что вектор будет содержать следующее число: (600, 500, 800, 150)

1 Ответ

1 голос
/ 20 января 2020

Оба цикла для i и z будут выполняться для одной итерации. если разница дат равна 1, то результат будет сохранен.

visited <- vector()
num_list <-vector()

for (i in 1:nrow(test)){
  for (z in 1:nrow(test)){
    if (test[z,2] - test[i,3] == 1){
      if (z %in% visited){
        next
      } else {
        result <- test[i,5] + test[z,5]
        num_list <- c(num_list, result)
        visited <- c(visited, z)
        print (result)
        break
      }
    }
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...