es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando dplyr: lag() con datos de series de tiempo intermitentes.

Tengo algunos datos de series temporales que se parecen a lo siguiente:

df <- data.frame(id = c("001","001","001","002", "003","003","003","003", 
                        "004","004","004","005"), 
                 year_mon = c(2021-01, 2021-02, 2021-03, 2021-01, 2021-01, 2021-05, 2021-06, 
                              2021-08, 2021-03, 2021-04, 2021-07, 2021-08),
                 value = c(15, 20, 25, 30, 19, 17, 18, 21, 39, 45, 21, 10))


id year_mon value
001 2021-01 15
001 2021-02 20
001 2021-03 25
002 2021-01 30
003 2021-01 19
003 2021-05 17
003 2021-06 18
003 2021-08 21
004 2021-03 39
004 2021-04 45
004 2021-07 21
005 2021-08 10

Quiero retrasar el valor 'value' en 1 mes para cada ID. Sin embargo, en la columna 'year_mon' hay algunas fechas faltantes.

Intenté hacer lo siguiente:


new_df <- df %>%
arrange(id, year_mon) %>%
group_by(id) %>%
mutate(lag_value = lag(value, 1L))

Pero esto devuelve valores de la fila anterior en lugar del mes anterior. ¿Cómo puedo hacerlo para que la salida de los datos sea:


id year_mon value lag_value
001 2021-01 15 NA
001 2021-02 20 15
001 2021-03 25 20
002 2021-01 30 NA
003 2021-01 19 NA
003 2021-05 17 NA
003 2021-06 18 17
003 2021-08 21 NA
004 2021-03 39 NA
004 2021-04 45 39
004 2021-07 21 NA
005 2021-08 10 NA

Donde se devuelva un 'NA' si el mes en 'year_mon' no es el mes anterior.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para retrasar el valor en 1 mes para cada id teniendo en cuenta las fechas faltantes en la columna year_mon, primero debemos convertir la columna year_mon a un formato de fecha, crear una secuencia de fechas para cada id que incluya los meses faltantes utilizando la función complete() del paquete tidyr, y luego usar la función lag() para retrasar la columna value en 1 mes. Aquí está el código:

    “`{r}
    library(tidyr)
    library(dplyr)

    new_df <- df %>%
    mutate(year_mon = as.Date(paste0(year_mon, “-01”))) %>% # convertir year_mon al formato de fecha
    arrange(id, year_mon) %>%
    group_by(id) %>%
    complete(year_mon = seq.Date(min(year_mon), max(year_mon), by = “month”)) %>% # crear secuencia de fechas para cada id
    mutate(lag_value = lag(value, 1L)) # retrasar la columna value en 1 mes

    new_df <- new_df[!is.na(new_df$value),] # eliminar filas con NAs en la columna value
    “`

    El resultado new_df tendrá NA en la columna lag_value para la primera fila de cada id, y para cualquier mes faltante en medio.

Comments are closed.