У меня проблема с cumsum
для вектора, который начинается с NA
. У вас есть идея, как превратить первый NA
в 0
или просто пропустите первый вариант?Проблема с функцией cumsum
Вот мой код:
Symbol <- c("AA", "AA", "AA", "AA", "AA", "AA", "AA","AA","AA","AA", "AA", "AA", "AA", "AA", "AA", "AA","AA","AA","AA")
days <- c(3, 10, 29,13,14,29,19,1,4,3, 10, 29,13,14,29,19,1,4,7)
month <- c(1, 1, 5,7,1,2,5,7,9,1, 1, 5,7,1,2,5,7,9,12)
years <- c(2014,2014,2015,2015,2016,2016,2016,2016,2016,2014,2014,2015,2015,2016,2016,2016,2016,2016,2016)
price <- c(10,20,15,14,16,17,9,14,12,14,15,18,5,10,6,18,12,8, 14)
shares <- c(100,50,-30,400,-200,-100,-100,-150,-120,-100,-50,-100,70,-70,190,250,50,120,150)
df <- data.frame(Symbol,days,month,years,price,shares)
df %>%
mutate(value = shares*price,
cum_shares = cumsum(shares),
cum_value = ifelse(lag(cum_shares != 0),
ifelse(lag(cum_shares) > 0 & cum_shares < 0 | lag(cum_shares) > 0 & cum_shares < 0,
cum_shares*price,
cumsum(value)),
value),
Av_price = ifelse(is.infinite(cum_value/cum_shares),
0,
cum_value/cum_shares),
Profit = ifelse(cum_shares >= 0 & shares<0,
ifelse(lag(cum_shares) > 0 & cum_shares < 0, #YES
(lag(cum_shares)*Av_price) - (lag(cum_shares)*lag(Av_price)), #yes
(lag(Av_price)*shares)-value), #no
ifelse(cum_shares <= 0 & shares>0, #NOP
ifelse(lag(cum_shares) > 0 & cum_shares < 0, #yes
(lag(cum_shares)*Av_price) - (lag(cum_shares)*lag(Av_price)),
lag(Av_price)*shares-value),
ifelse(cum_shares <= 0 & shares < 0, #no
ifelse(lag(cum_shares) > 0 & cum_shares < 0,
(-lag(cum_shares)*lag(Av_price)) + (lag(cum_shares)*price),
0),
ifelse(cum_shares>0 & shares > 0,
ifelse(lag(cum_shares) <0 & shares >0,
(-lag(cum_shares)*lag(Av_price)) + (lag(cum_shares)*price),
0),
0))
)),
cum_profit = cumsum(Profit))
Просто подмножество. .. – Roland
'cumsum (c (0, x [-1]))' ... – Gregor
Для пропущенных значений 'NA' в' cumsum' см. Http://stackoverflow.com/questions/25576358/calculate-cumsum-while-ignoring-na-values –