Как использовать cumsum, игнорируя NaN в r

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

Набор данных:

Col1        Col2            Col3           Col4
2017-12-26  0.000000e+00    NaN              NaN
2017-12-27  3.295056e-05    NaN              NaN
2017-12-28  2.998402e-03    NaN              NaN
2017-12-29  -3.777862e-03   NaN              NaN
2018-01-01  0.000000e+00    NaN              NaN
2018-01-02  -6.265354e-04   0.001210748   -1.837284e-03
2018-01-03  1.501328e-03    0.001505680   -4.351903e-06
2018-01-04  1.103716e-03    0.001266719   -1.630024e-04
2018-01-05  7.437758e-03    0.005948840    1.488918e-03
2018-01-08  1.323032e-03    0.000949433    3.735992e-04

Выход:

structure(list(date = structure(c(17526, 17527, 17528, 17529, 
17532, 17533, 17534, 17535, 17536, 17539, 17540, 17541), class = "Date"), 
    S.P.ASX.200 = c(0, 3.29505576881495e-05, 0.00299840195060885, 
    -0.00377786173026062, 0, -0.000626535423983166, 0.0015013280979328, 
    0.00110371639430684, 0.00743775814121861, 0.00132303219378338, 
    0.000880856061594715, -0.00637243717200697), portfolio.average = c(NaN, 
    NaN, NaN, NaN, NaN, 0.00121074842324788, 0.00150568000136751, 
    0.00126671875198612, 0.00594883984640553, 0.000949433018286304, 
    -0.00477888742856801, -0.007316033066539), marketed_adjusted_return = c(NaN, 
    NaN, NaN, NaN, NaN, -0.00183728384723105, -4.35190343470821e-06, 
    -0.000163002357679275, 0.00148891829481308, 0.000373599175497076, 
    0.00565974349016273, 0.000943595894532028)), row.names = 612:623, class = "data.frame")

Я пробовал использовать функцию ниже, но она возвращает пятый столбец только с NaN.

cumulative_a <- a %>%
  mutate(cumulative = cumsum(a[,4]))

Есть ли способ выполнить cumsum, игнорируя значения NaN?


person Trong Nguyen    schedule 03.10.2020    source источник


Ответы (2)


Вы можете заменить NA на 0, а затем использовать cumsum :

df$cum_a <- cumsum(replace(df$marketed_adjusted_return, 
                   is.na(df$marketed_adjusted_return), 0))
person Ronak Shah    schedule 03.10.2020

Просто игнорируйте NaN, когда делаете свою cumsum:

a$cumsum <- replace(a[,4], !is.nan(a[,4]), cumsum(a[,4][!is.nan(a[,4])]))
a
#>           date   S.P.ASX.200 portfolio.average marketed_adjusted_return        cumsum
#> 612 2017-12-26  0.000000e+00               NaN                      NaN           NaN
#> 613 2017-12-27  3.295056e-05               NaN                      NaN           NaN
#> 614 2017-12-28  2.998402e-03               NaN                      NaN           NaN
#> 615 2017-12-29 -3.777862e-03               NaN                      NaN           NaN
#> 616 2018-01-01  0.000000e+00               NaN                      NaN           NaN
#> 617 2018-01-02 -6.265354e-04       0.001210748            -1.837284e-03 -0.0018372838
#> 618 2018-01-03  1.501328e-03       0.001505680            -4.351903e-06 -0.0018416358
#> 619 2018-01-04  1.103716e-03       0.001266719            -1.630024e-04 -0.0020046381
#> 620 2018-01-05  7.437758e-03       0.005948840             1.488918e-03 -0.0005157198
#> 621 2018-01-08  1.323032e-03       0.000949433             3.735992e-04 -0.0001421206
#> 622 2018-01-09  8.808561e-04      -0.004778887             5.659743e-03  0.0055176229
#> 623 2018-01-10 -6.372437e-03      -0.007316033             9.435959e-04  0.0064612187
person Allan Cameron    schedule 03.10.2020