2016-11-06 2 views
3

Это, на мой взгляд, таблица data.table. Последний столбец NewShares - это мои искомые столбцы.R Накопительная сумма, основанная на двух переменных

library(data.table) 
dt <- fread(' 
    Client Level NumShares Interest NewShares 
    A   0  10   0   10 
    A   0  0   0   10 
    A   1  0   .1   11 
    A   0  9   0   20 
    A   1  0   .2   24') 

Я хочу, чтобы накопительные NumShares учитывались при покупке NewShares с процентами. Таким образом, по состоянию на 1-й строкой совокупные акции равны 10. По состоянию на 3-й ряд, Level==1, поэтому я должен добавить проценты. Это будет 10+(10*.1)=11. По состоянию на 4-й строке совокупные акции составляют 11+9 =20. В последней строке, Level==1, поэтому новые акции 20+(20*.2) = 24

Я пробовал:

dt[,NewShares:= NumShares* cumprod(1+ NumShares*Interest),by=Client] 
+0

Авось 'DT [, NewSharesN: = потолок (cumsum (cumsum (NumShares) * Interest + NumShares)), Client] ' – akrun

ответ

3

Мы можем сделать двойной cumsum и обернуть его ceiling

dt[, NewSharesN := ceiling(cumsum(cumsum(NumShares)*Interest + NumShares)) , by = Client] 
dt 
# Client Level NumShares Interest NewShares NewSharesN 
#1:  A  0  10  0.0  10   10 
#2:  A  0   0  0.0  10   10 
#3:  A  1   0  0.1  11   11 
#4:  A  0   9  0.0  20   20 
#5:  A  1   0  0.2  24   24 
Смежные вопросы