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.
davy.ai
Para retrasar el
valor
en 1 mes para cadaid
teniendo en cuenta las fechas faltantes en la columnayear_mon
, primero debemos convertir la columnayear_mon
a un formato de fecha, crear una secuencia de fechas para cadaid
que incluya los meses faltantes utilizando la funcióncomplete()
del paquetetidyr
, y luego usar la funciónlag()
para retrasar la columnavalue
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 columnalag_value
para la primera fila de cadaid
, y para cualquier mes faltante en medio.