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.

Agregue filas con intervalo de fecha/hora entre dos fechas r

“` biblioteca(dplyr)
df <- tibble(id = c(“1”, “2”, “3”, “4”),
fecha_inicio = c(“2021-01-01”, “2021-01-15”, “2021-02-03”, “2021-05-20”),
fecha_final = c(“2021-10-11”, “2021-08-17”, “2021-12-20”, “2021-07-01”))
df

Obtener la diferencia entre fecha_final y fecha_inicio

df <- df %>%
mutate(months = lubridate::interval(lubridate::ymd(fecha_inicio), lubridate::ymd(fecha_final)) %/% months(1))

crear una tibble temporal con los meses

temp <- tibble(month = seq.Date(from = as.Date(“2021-01-01”),
to = as.Date(“2021-12-01”), by = “1 months”))

unir la tibble temporal a la tibble original

df <- df %>%
group_by(id) %>%
expand(month = temp$month) %>%
left_join(df, by = “id”) %>%
select(id, fecha_inicio, year_month = month) %>%
mutate(year_month = format(year_month, “%Y-%m”)) %>%
slice(1:nrow(.)-1) %>%
arrange(id, year_month)

df

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ampliar los datos agrupados con filas adicionales, podemos usar la función complete del paquete tidyr. Primero, necesitamos crear una nueva columna year_month que contenga solo la parte de año y mes de la columna start_date utilizando el paquete lubridate.

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

    df <- df %>%
    mutate(year_month = format(ymd(start_date), “%Y-%m”))


    Luego, podemos agrupar los datos por `id` y `year_month` y calcular la diferencia entre `end_date` y `start_date` utilizando la función `mutate`. ```{r} df <- df %>% group_by(id, year_month) %>% mutate(month_diff = as.numeric(difftime(ymd(end_date), ymd(start_date), units = "days"))/30)

    Finalmente, podemos usar la función complete para agregar filas faltantes para cada combinación de id y year_month, y completar los valores faltantes con 0 utilizando el argumento fill.

    {r}
    df <- df %>%
    complete(id, year_month = seq(min(year_month), max(year_month), by = "month"), fill = list(month_diff = 0))

    Esto nos dará el resultado deseado como se muestra en la pregunta.

Comments are closed.