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.

Cómo crear una nueva columna que especifique a qué rango de años pertenece una fecha (como el año académico)?

En algunos casos, un “año” no necesariamente comienza el 1 de enero. Por ejemplo, el año académico comienza a finales de agosto en los Estados Unidos. Otro ejemplo es la temporada de la NBA.

Mi pregunta: dados datos que contienen una columna de fechas, quiero crear otra columna que haga referencia a qué período pertenece. Por ejemplo, consideremos que se nos da el siguiente tib:

library(lubridate, warn.conflicts = FALSE)
library(tibble)

tib <- tibble(my_dates = as_date(c("1999-01-01", "2010-08-09", "2010-09-02", "1995-03-02")))
tib

Deseamos añadir una columna que se refiera al año académico al que pertenece cada fecha, siempre y cuando el año académico comience el 31 de agosto:

desired_output <- 
  tib %>%
  mutate(belongs_to_school_year = c("1998-1999", "2009-2010", "2010-2011", "1994-1995"))

desired_output
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear la columna belongs_to_school_year basada en my_dates, podemos usar mutate() del paquete dplyr y la función if_else() de dplyr o la función ifelse() de R base para verificar si el mes y el día de cada fecha están antes o después del inicio del año académico (31 de agosto).

    Aquí está el código:

    library(dplyr)
    tib %>% 
      mutate(year_start = if_else(month(my_dates) < 9 | 
                                  (month(my_dates) == 9 & day(my_dates) <= 1), 
                                  year(my_dates) - 1, year(my_dates)),
             year_end = year_start + 1,
             belongs_to_school_year = paste(year_start, year_end, sep = "-")) %>% 
      select(-year_start, -year_end)
    

    En este código, primero creamos una columna year_start que almacena el año de inicio del año académico basado en la columna my_dates. Usamos if_else() para verificar si el mes de cada fecha es anterior a septiembre o si es septiembre pero anterior al 1 de septiembre. Si alguna de estas condiciones es verdadera, restamos 1 al año de la fecha para obtener el inicio del año académico.

    Luego, creamos una columna year_end sumando 1 a la columna year_start.

    Finalmente, creamos la columna belongs_to_school_year pegando juntas las columnas year_start y year_end con un separador “-“, y eliminamos las columnas year_start y year_end usando select(). El resultado es el resultado deseado:

    ## # A tibble: 4 x 2
    ##   my_dates   belongs_to_school_year
    ##   <date>     <chr>                 
    ## 1 1999-01-01 1998-1999             
    ## 2 2010-08-09 2010-2011             
    ## 3 2010-09-02 2010-2011             
    ## 4 1995-03-02 1994-1995             
    

    En este ejemplo, dado que el año académico comienza el 31 de agosto, cualquier fecha anterior a esa en un año determinado pertenece al año académico anterior. Por lo tanto, la fecha 2010-08-09 pertenece al año académico 2010-2011, mientras que la fecha 2010-09-02 pertenece al mismo año académico, pero el nombre del año académico en sí es diferente (ya que comienza en septiembre).

Comments are closed.