R 具有累积和函数的NA问题

R 具有累积和函数的NA问题,r,R,我对以NA开头的向量的cumsum有一个问题。 您知道如何将第一个NA转换为0还是跳过第一个 这是我的密码: 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) mo

我对以
NA
开头的向量的
cumsum
有一个问题。 您知道如何将第一个
NA
转换为
0
还是跳过第一个

这是我的密码:

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))
符号0,
ifelse(滞后(累积份额)0,
(-滞后(累积股份)*滞后(平均价格)+(滞后(累积股份)*价格),
0),
0))
)),
累计利润=累计(利润))

对于向量
x

# Skip the first element:
x[-1]

# Replace the first element with 0
c(0, x[-1])

# Remove all missing values
na.omit(x)   # adds attributes, which can be annoying
x[!is.na(x)]

其中任何一个都可以包装在
cumsum()
dplyr的
lag
中,它有一个
default
参数,可以设置该参数来指定要填充的值。例如,使用内置数据框
BOD

BOD %>% mutate(Lag = lag(Time, default = 0), Cum = cumsum(Lag))
给予:

  Time demand Lag Cum
1    1    8.3   0   0
2    2   10.3   1   1
3    3   19.0   2   3
4    4   16.0   3   6
5    5   15.6   4  10
6    7   19.8   5  15
  Time demand Lag Cum
1    1    8.3  NA   0
2    2   10.3   1   1
3    3   19.0   2   3
4    4   16.0   3   6
5    5   15.6   4  10
6    7   19.8   5  15
或者,如果您想用NA显示滞后,但在
cumsum
中有0:

BOD %>% mutate(Lag = lag(Time), Cum = cumsum(lag(Time, default = 0)))
给予:

  Time demand Lag Cum
1    1    8.3   0   0
2    2   10.3   1   1
3    3   19.0   2   3
4    4   16.0   3   6
5    5   15.6   4  10
6    7   19.8   5  15
  Time demand Lag Cum
1    1    8.3  NA   0
2    2   10.3   1   1
3    3   19.0   2   3
4    4   16.0   3   6
5    5   15.6   4  10
6    7   19.8   5  15

简单地子集…
cumsum(c(0,x[-1]))
…要跳过
cumsum
中的
NA
值,请尝试将可复制的示例降至最低。在这种情况下,可以用更少的代码和数据来说明问题。