Цикл кумулятивной суммы с оператором if

#r #loops #sum

Вопрос:

У меня есть что-то вроде следующего фрейма данных в R. Я хочу создать цикл, который создает совокупную сумму с первой входящей суммой в качестве начального баланса, а затем вычитает исходящую сумму и добавляет входящую сумму. Любая идея, как это сделать в R, будет оценена по достоинству.

 Seq<-c(1,2,3,4,5)
Direction<-c("INCOMING","OUTGOING", "INCOMING", "OUTGOING", "OUTGOING")
Amount<-c(500,200,300,400,200)
df<-cbind(Seq, Direction, Amount)
 

Ответ №1:

Вы можете использовать cumsum и равенство, чтобы проверить, нужно ли вам добавлять или вычитать:

 df <- data.frame(Seq, Direction, Amount)
df

cumsum(df$Amount * ifelse(df$Direction == "INCOMING", 1, -1))
[1] 500 300 600 200   0
 

Ответ №2:

Попробуйте этот базовый код R

 transform(
    df,
    bal = cumsum(Amount * (2 * (Direction == "INCOMING") - 1))
)
 

что дает

   Seq Direction Amount bal
1   1  INCOMING    500 500
2   2  OUTGOING    200 300
3   3  INCOMING    300 600
4   4  OUTGOING    400 200
5   5  OUTGOING    200   0