Делать петли по группе в R - PullRequest
0 голосов
/ 16 апреля 2019

Вопрос новичка.У меня есть набор данных, который я использую для расчета некоторых учетных значений.Набор данных выглядит следующим образом


    ID   Period   Amount Interest O_Bal   C_Bal
    1     1        1234    0.07     1234  (1234+(1234*0.07)) = 1321
    1     2        1244    0.07     1321  (1321-1234+(1321*0.07))
    1     3           .....
    2     1            ......

...

Пожалуйста, игнорируйте фактические значения в таблице.На данный момент у меня есть первая строка для каждого идентификатора.Мне нужно создать цикл для каждой группы идентификаторов, чтобы начиная с периода 2 он вычислял итоговое сальдо по формуле во второй строке.Любые идеи?

Я пробовал следующее

   fin_calc$C_Bal = fin_calc$O_Bal + (fin_calc$O_Bal*0.07)

if (fin_calc$Period==1) {
  fin_calc$Cl_Bal = fin_calc$C_Bal
}

fin_c <- fin_calc %>%
  group_by(ID) %>%
  mutate(Cl_Bal = lag(Cl_Bal) - Amount_PA + (lag(Cl_Bal) - Amount_PA)*0.07)

Что он делает, это в состоянии продолжать с периода 1 до периода 2, но затем последующие периоды рассчитываются неправильно

 Data <- data.frame(
    ID = 1,
    Period = c(1,2,3),
    Amount_PA = c(0,2946737,3035139),
    O_Bal = c(30979981.5,0,0),
    C_Bal = c(33148580.2,0,0),
    Cl_Bal = c(33148580.2,32221382.2,-3345026.6)

  )

1 Ответ

0 голосов
/ 16 апреля 2019

Если, как вы говорите, у вас есть первая строка всех идентификаторов, и все идентификаторы соответствуют той же схеме, возможно, вы могли бы попробовать:

library(dplyr)
df%>%
group_By(ID)%>%
mutate(Closing_Bal = ifelse(is.na(lag(Opening_Bal),
Opening_Bal + (Opening_bal*Interest),
Opening_Bal - lag(Opening_Bal) + (Opening_bal*Interest))))

РЕДАКТИРОВАТЬ:

df <- df %>%
  group_by(ID)%>%
  mutate(Cl_Bal = lag(Cl_Bal) - Amount + (lag(Cl_Bal) - Amount)*0.07) %>% 
  mutate(Cl_Bal = ifelse(Cl_Bal < 0,lag(Cl_Bal) - Amount + (lag(Cl_Bal) - Amount)*0.07,Cl_Bal))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...