Saltar al contenido

R: suma acumulada durante el rango de fechas móviles

Hacemos una revisión exhaustiva cada noticia en nuestra página web con la meta de mostrarte siempre la información certera y actual.

Solución:

Una solución utilizando dplyr, tidyr, lubridatey zoo.

library(dplyr)
library(tidyr)
library(lubridate)
library(zoo)

dt2 <- dt %>%
  mutate(date = dmy(date)) %>%
  mutate(cumsum = cumsum(value)) %>%
  complete(date = full_seq(date, period = 1), fill = list(value = 0)) %>%
  mutate(cum_rolling10 = rollapplyr(value, width = 10, FUN = sum, partial = TRUE)) %>%
  drop_na(cumsum)
dt2
# A tibble: 15 x 4
         date value cumsum cum_rolling10
                   
 1 2000-01-01     9      9             9
 2 2000-01-02     1     10            10
 3 2000-01-05     9     19            19
 4 2000-01-06     3     22            22
 5 2000-01-07     4     26            26
 6 2000-01-08     3     29            29
 7 2000-01-13    10     39            29
 8 2000-01-14     9     48            38
 9 2000-01-18     2     50            21
10 2000-01-19     9     59            30
11 2000-01-21     8     67            38
12 2000-01-25     5     72            24
13 2000-01-26     1     73            25
14 2000-01-30     6     79            20
15 2000-01-31     6     85            18

DATOS

dt <- structure(list(date = c("1/01/2000", "2/01/2000", "5/01/2000", 
"6/01/2000", "7/01/2000", "8/01/2000", "13/01/2000", "14/01/2000", 
"18/01/2000", "19/01/2000", "21/01/2000", "25/01/2000", "26/01/2000", 
"30/01/2000", "31/01/2000"), value = c(9L, 1L, 9L, 3L, 4L, 3L, 
10L, 9L, 2L, 9L, 8L, 5L, 1L, 6L, 6L)), .Names = c("date", "value"
), row.names = c(NA, -15L), class = "data.frame")

Recomiendo usar el paquete runner diseñado para calcular funciones en ventanas móviles/en ejecución. Puedes lograr esto usando sum_run - una línea aquí:

library(runner)
library(dplyr)

df %>%
  mutate(
    cum_rolling_10 = sum_run(
      x = df$value, 
      k = 10, 
      idx = as.Date(df$date, format = "%d/%m/%Y"))
  )


df

#          date value cum_rolling_10
# 1   1/01/2000     9              9
# 2   2/01/2000     1             10
# 3   5/01/2000     9             19
# 4   6/01/2000     3             22
# 5   7/01/2000     4             26
# 6   8/01/2000     3             29
# 7  13/01/2000    10             29
# 8  14/01/2000     9             38
# 9  18/01/2000     2             21
# 10 19/01/2000     9             30
# 11 21/01/2000     8             38
# 12 25/01/2000     5             24
# 13 26/01/2000     1             25
# 14 30/01/2000     6             20
# 15 31/01/2000     6             18

¡Disfrutar!

No se te olvide dar difusión a esta sección si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *