Tengo un marco de datos df de la siguiente manera:

df <- read.table(text = "date    value1    value2
           2019-01        0.7         1.4
           2019-02        0.11        2.3
           2019-03        1.22        6.7
           2019-04        0.44        5.2
           2019-05        0.19        2.3
           2019-06        3.97        9.5
           2019-07        1.24        2.4
           2019-08        0.23        2.88
           2019-09        0.66        9.5
           2019-10        1.24        2.2
           2019-11        0.23        2.28
           2019-12        0.66        9.3
           2020-01        0.6         1.2
           2020-02        0.13        2.1
           2020-03        1.12        6.4
           2020-04        0.34        5.1
           2020-05        0.29        2.1
           2020-06        3.47        9
           2020-07        1.44        2.1
           2020-08        0.33        2.5
           2020-09        0.76        9.2
           2020-07        1.28        2.43
           2020-08        0.25        2.8
           2020-09        0.69        9.5",
                 header = TRUE, stringsAsFactors = FALSE)

¿Cómo puedo calcular pct_changes mensuales y pct_changes anuales en las columnas value1 y value2 en R? Gracias.

En pandas, podemos usar apply(lambda: x.pct_change()) para month_pct y apply(lambda: x.pct_change(12)) para year_pct, no sé si en R tiene una función similar o no.

0
ahbon 24 jun. 2020 a las 11:50

2 respuestas

La mejor respuesta

Su columna de fecha es character, es mejor convertirla en un objeto Date. Utilice la función lag del paquete dplyr para realizar los cálculos.

Esto es para la columna value1.

 df %>%
    mutate(date = lubridate::ymd(paste0(date, '-01'))) %>%
    mutate(monthly_pct_changes = round((value1 / lag(value1) - 1) * 100, 2),
           yearly_pct_changes = round((value1 / lag(value1, 12) - 1) * 100, 2))

Repita el mismo procedimiento para la otra columna.

1
AlexB 24 jun. 2020 a las 09:33

Puede usar lag para acceder al valor de la fila anterior:

library(dplyr)

df %>%
  mutate(across(c(value1,value2), list(monthly = ~(. - lag(.))/lag(.), 
                                       yearly = ~(. - lag(., 12))/lag(., 12))))

#      date value1 value2 value1_monthly value1_yearly value2_monthly value2_yearly
#1  2019-01   0.70   1.40             NA            NA             NA            NA
#2  2019-02   0.11   2.30    -0.84285714            NA     0.64285714            NA
#3  2019-03   1.22   6.70    10.09090909            NA     1.91304348            NA
#4  2019-04   0.44   5.20    -0.63934426            NA    -0.22388060            NA
#...
1
Ronak Shah 24 jun. 2020 a las 09:04