Capítulo10 Transformación: Mutate, transmute, lag, lead, cumsum, cummean, cumvar

10.1 Funciones en este módulo

-   mutate() # crea nuevas variables
-   transmute() # crea nuevas variables y elimina las antiguas
-   lag() # calcula la diferencia entre valores en la misma columna
-   lead() # calcula el siguiente valor en un vector
-   cumsum() # suma cumulativa
-   cummean() # promedio cumulativo
-   cumvar() # varianza cumulativa

mutate() y transmute() — crear columnas nuevas.

  • mutate(nueva = expresión): añade columnas calculadas y conserva las demás.
  • transmute(): igual, pero solo deja las columnas nuevas.
  • Uso: la expresión puede combinar otras columnas (p. ej. velocidad = distancia / tiempo).

Ejercicios de este capítulo. Al final de cada idea hay un ejercicio con un conjunto de datos distinto al de los ejemplos (aquí usamos millas y clima del paquete datos). El código de los ejemplos te sirve de modelo, pero el script del ejercicio lo escribes tú: copiar y pegar no enseña.

Para recibir los puntos hay que entregar, en un documento .Rmd bien organizado: (1) el script, (2) el resultado y (3) una explicación en palabras de lo que encontraste.

library(tidyverse)
library(datos)
names(vuelos)
##  [1] "anio"               "mes"                "dia"               
##  [4] "horario_salida"     "salida_programada"  "atraso_salida"     
##  [7] "horario_llegada"    "llegada_programada" "atraso_llegada"    
## [10] "aerolinea"          "vuelo"              "codigo_cola"       
## [13] "origen"             "destino"            "tiempo_vuelo"      
## [16] "distancia"          "hora"               "minuto"            
## [19] "fecha_hora"
# |> es igual %>% 
new_df=vuelos |> dplyr::select(distancia, tiempo_vuelo, atraso_salida,  atraso_llegada) |> 
  mutate( ganancia = atraso_salida - atraso_llegada,
          velocidad = distancia / tiempo_vuelo * 60)

new_df
## # A tibble: 336,776 × 6
##    distancia tiempo_vuelo atraso_salida atraso_llegada ganancia velocidad
##        <dbl>        <dbl>         <dbl>          <dbl>    <dbl>     <dbl>
##  1      1400          227             2             11       -9      370.
##  2      1416          227             4             20      -16      374.
##  3      1089          160             2             33      -31      408.
##  4      1576          183            -1            -18       17      517.
##  5       762          116            -6            -25       19      394.
##  6       719          150            -4             12      -16      288.
##  7      1065          158            -5             19      -24      404.
##  8       229           53            -3            -14       11      259.
##  9       944          140            -3             -8        5      405.
## 10       733          138            -2              8      -10      319.
## # ℹ 336,766 more rows

10.2 Crear un data frame más pequeño con las variables de interés

library(tidyverse)
library(nycflights13)
head(flights)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## 5  2013     1     1      554            600        -6      812            837
## 6  2013     1     1      554            558        -4      740            728
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
names(vuelos)
##  [1] "anio"               "mes"                "dia"               
##  [4] "horario_salida"     "salida_programada"  "atraso_salida"     
##  [7] "horario_llegada"    "llegada_programada" "atraso_llegada"    
## [10] "aerolinea"          "vuelo"              "codigo_cola"       
## [13] "origen"             "destino"            "tiempo_vuelo"      
## [16] "distancia"          "hora"               "minuto"            
## [19] "fecha_hora"
  vuelos_sml <- dplyr::select(vuelos, 
  anio:dia, 
  starts_with("atraso"), 
  distancia, 
  tiempo_vuelo
)
head(vuelos_sml)
## # A tibble: 6 × 7
##    anio   mes   dia atraso_salida atraso_llegada distancia tiempo_vuelo
##   <int> <int> <int>         <dbl>          <dbl>     <dbl>        <dbl>
## 1  2013     1     1             2             11      1400          227
## 2  2013     1     1             4             20      1416          227
## 3  2013     1     1             2             33      1089          160
## 4  2013     1     1            -1            -18      1576          183
## 5  2013     1     1            -6            -25       762          116
## 6  2013     1     1            -4             12       719          150

10.3 Crear nuevas variables

mutate(vuelos_sml,
  ganado = atraso_salida - atraso_llegada,
  velocidad = distancia / tiempo_vuelo * 60
)
## # A tibble: 336,776 × 9
##     anio   mes   dia atraso_salida atraso_llegada distancia tiempo_vuelo ganado
##    <int> <int> <int>         <dbl>          <dbl>     <dbl>        <dbl>  <dbl>
##  1  2013     1     1             2             11      1400          227     -9
##  2  2013     1     1             4             20      1416          227    -16
##  3  2013     1     1             2             33      1089          160    -31
##  4  2013     1     1            -1            -18      1576          183     17
##  5  2013     1     1            -6            -25       762          116     19
##  6  2013     1     1            -4             12       719          150    -16
##  7  2013     1     1            -5             19      1065          158    -24
##  8  2013     1     1            -3            -14       229           53     11
##  9  2013     1     1            -3             -8       944          140      5
## 10  2013     1     1            -2              8       733          138    -10
## # ℹ 336,766 more rows
## # ℹ 1 more variable: velocidad <dbl>

Ejercicio 1: crear variables nuevas con mutate()

Usa el conjunto de datos millas del paquete datos (NO vuelos). Empieza con names(millas) y head(millas) para ver qué variables tienes.

  1. Crea dos variables nuevas: promedio_millas, el promedio del rendimiento en ciudad y en autopista, y diferencia, cuánto más rinde el vehículo en autopista que en ciudad.
  2. ¿Cuál clase de vehículo tiene la mayor diferencia promedio? Contesta en palabras, no solamente con la tabla.

Verifica: tu tabla debe conservar todas las columnas originales de millas más las dos nuevas.

# Escribe tu código aquí

Ejercicio 2: cuidado con las unidades

En millas el rendimiento está en millas por galón. Crea la variable km_por_litro multiplicando autopista por 0.425144.

  1. ¿Cuál fabricante tiene el promedio más alto de km_por_litro?
  2. ¿Cambia la respuesta si haces lo mismo con ciudad en vez de autopista? ¿Por qué crees que pasa eso?
# Escribe tu código aquí

10.4 transmute()

Para guardar solamente la nueva variable usa transmute

Usa mutate() cuando quieras conservar las columnas originales y añadir nuevas; usa transmute() cuando solo te interesen las columnas nuevas.

flights |> transmute(
  gain = dep_delay - arr_delay,
  hours = air_time / 60,
  gain_per_hour = gain / hours
)
## # A tibble: 336,776 × 3
##     gain hours gain_per_hour
##    <dbl> <dbl>         <dbl>
##  1    -9 3.78          -2.38
##  2   -16 3.78          -4.23
##  3   -31 2.67         -11.6 
##  4    17 3.05           5.57
##  5    19 1.93           9.83
##  6   -16 2.5           -6.4 
##  7   -24 2.63          -9.11
##  8    11 0.883         12.5 
##  9     5 2.33           2.14
## 10   -10 2.3           -4.35
## # ℹ 336,766 more rows

Ejercicio 3: transmute() no es lo mismo que mutate()

Con millas, crea la variable razon = autopista / ciudad de dos maneras: primero con transmute() y después con mutate().

  1. ¿Cuántas columnas tiene cada resultado?
  2. Explica en una oración cuándo te conviene usar cada una.
  3. ¿Qué significa biológicamente (o mecánicamente) que razon sea mayor que 1?
# Escribe tu código aquí

10.5 lag()

lag() y lead() — valor anterior / siguiente.

  • lag(x, n): trae el valor de n filas atrás (por defecto 1); útil para calcular cambios (x - lag(x)).
  • lead(x, n): trae el valor de n filas adelante.
  • Requisito: ordena las filas primero (arrange()), porque operan según el orden actual.

Para calcular diferencias entre variables en la misma columna

lag() y lead() trabajan según el orden actual de las filas. Ordena tus datos (por ejemplo por fecha con arrange()) antes de usarlas, o los desplazamientos no tendrán sentido.

set.seed(12345) # que los datos sean al azar, siempre sean los mismo, se usa el "set.seed()" para enseñanza.
#rnorm()  DATOS CON DISTRIBUCION NORMAL


data=rpois(14, 10)
df=as_tibble(data)
df
## # A tibble: 14 × 1
##    value
##    <int>
##  1    11
##  2    12
##  3     9
##  4     8
##  5    11
##  6     4
##  7    11
##  8     7
##  9     8
## 10    11
## 11     9
## 12    10
## 13     9
## 14    11
df %>% 
  dplyr::select(value) %>% 
  mutate(lag1=lag(value)) %>% 
  mutate(lag3=lag(value, 3)) %>% 
  mutate(lag7=lag(value,5))
## # A tibble: 14 × 4
##    value  lag1  lag3  lag7
##    <int> <int> <int> <int>
##  1    11    NA    NA    NA
##  2    12    11    NA    NA
##  3     9    12    NA    NA
##  4     8     9    11    NA
##  5    11     8    12    NA
##  6     4    11     9    11
##  7    11     4     8    12
##  8     7    11    11     9
##  9     8     7     4     8
## 10    11     8    11    11
## 11     9    11     7     4
## 12    10     9     8    11
## 13     9    10    11     7
## 14    11     9     9     8
## Calcular la diferencia usando lag

df %>% 
  dplyr::select(value) %>% 
  mutate(lag1=lag(value)) %>% 
  mutate(Changes=value-lag(value, 1)) # El cambio en posición de los valores entre las filas
## # A tibble: 14 × 3
##    value  lag1 Changes
##    <int> <int>   <int>
##  1    11    NA      NA
##  2    12    11       1
##  3     9    12      -3
##  4     8     9      -1
##  5    11     8       3
##  6     4    11      -7
##  7    11     4       7
##  8     7    11      -4
##  9     8     7       1
## 10    11     8       3
## 11     9    11      -2
## 12    10     9       1
## 13     9    10      -1
## 14    11     9       2

10.6 Usa “Lag” con “IncCasosSaludNuevo” en COVID-19 PR

Evalúa la diferencia en números de casos entre 7 días de la semana en números de casos nuevos de COVID, “IncCasosSaludNuevo”

library(readr)
library(dplyr)
#names(url_COVID_PR)
url_COVID_PR <- read_csv("Datos/url_COVID_PR.csv")
head(url_COVID_PR, 100)
## # A tibble: 100 × 18
##     ...1 Fecha   Muertes IncrementoMuertes CasosPCR_Salud IncCasosPCR_Salud
##    <dbl> <chr>     <dbl>             <dbl>          <dbl>             <dbl>
##  1     1 3/12/20       0                 0             NA                NA
##  2     2 3/13/20       0                 0             NA                NA
##  3     3 3/14/20       0                 0             NA                NA
##  4     4 3/15/20       0                 0             NA                NA
##  5     5 3/16/20       0                 0             NA                NA
##  6     6 3/17/20       0                 0             NA                NA
##  7     7 3/18/20       0                 0             NA                NA
##  8     8 3/19/20       0                 0             NA                NA
##  9     9 3/20/20       0                 0             NA                NA
## 10    10 3/21/20       0                 0             NA                NA
## # ℹ 90 more rows
## # ℹ 12 more variables: CasosSaludNuevo <dbl>, IncCasosSaludNuevo <dbl>,
## #   HospitCOV19 <dbl>, CamasICU <dbl>, CamasICU_disp <dbl>, Ventiladores <dbl>,
## #   MuertesSalud <dbl>, IncMueSalud <dbl>, VacDoses <dbl>, VacAdm <dbl>,
## #   N1MoreDoses <dbl>, N2Doses <dbl>
#names(url_COVID_PR)
names(url_COVID_PR)
##  [1] "...1"               "Fecha"              "Muertes"           
##  [4] "IncrementoMuertes"  "CasosPCR_Salud"     "IncCasosPCR_Salud" 
##  [7] "CasosSaludNuevo"    "IncCasosSaludNuevo" "HospitCOV19"       
## [10] "CamasICU"           "CamasICU_disp"      "Ventiladores"      
## [13] "MuertesSalud"       "IncMueSalud"        "VacDoses"          
## [16] "VacAdm"             "N1MoreDoses"        "N2Doses"
df2=url_COVID_PR %>% 
  dplyr::select(IncCasosSaludNuevo) %>% 
  mutate(Cambios_Casos=IncCasosSaludNuevo-lag(IncCasosSaludNuevo,7)) 





df2
## # A tibble: 587 × 2
##    IncCasosSaludNuevo Cambios_Casos
##                 <dbl>         <dbl>
##  1                  2            NA
##  2                  3            NA
##  3                  3            NA
##  4                  0            NA
##  5                  9            NA
##  6                  7            NA
##  7                  6            NA
##  8                  5             3
##  9                 14            11
## 10                 12             9
## # ℹ 577 more rows
df2 %>% 
  dplyr::select(IncCasosSaludNuevo, Cambios_Casos) %>% 
  colMeans(na.rm=TRUE)
## IncCasosSaludNuevo      Cambios_Casos 
##        257.8310580          0.4507772
#df2 %>% 
#  select()
#  slice(na.rm=TRUE) # lets you index rows by their (integer) locations. It allows you to select, remove, and duplicate rows. It is accompanied by a number of helpers for common use cases

Ejercicio 4: lag() con datos de clima

Usa el conjunto de datos clima del paquete datos: son mediciones por hora de tres aeropuertos de Nueva York. Mira primero names(clima).

  1. Filtra las filas de origen == "EWR" del mes de enero (mes == 1) y ordena por fecha_hora (¿por qué es indispensable ordenar antes?).
  2. Crea cambio_temp: cuánto cambió la temperatura respecto a la hora anterior.
  3. ¿Por qué la primera fila tiene NA?
  4. ¿En qué hora ocurrió el mayor aumento de temperatura de una hora a la otra?

Verifica: cambio_temp debe tener exactamente un NA, y debe estar en la primera fila.

# Escribe tu código aquí

10.7 lead(),

is the “next” (lead()) values in a vector/column

set.seed(12345)
data=rpois(15, 10)
df=as_tibble(data)
df
## # A tibble: 15 × 1
##    value
##    <int>
##  1    11
##  2    12
##  3     9
##  4     8
##  5    11
##  6     4
##  7    11
##  8     7
##  9     8
## 10    11
## 11     9
## 12    10
## 13     9
## 14    11
## 15    13
df %>% 
  dplyr::select(value) %>% 
  mutate(lead1=lead(value)) %>% 
  mutate(lead3=lead(value, 3))
## # A tibble: 15 × 3
##    value lead1 lead3
##    <int> <int> <int>
##  1    11    12     8
##  2    12     9    11
##  3     9     8     4
##  4     8    11    11
##  5    11     4     7
##  6     4    11     8
##  7    11     7    11
##  8     7     8     9
##  9     8    11    10
## 10    11     9     9
## 11     9    10    11
## 12    10     9    13
## 13     9    11    NA
## 14    11    13    NA
## 15    13    NA    NA
# Calculate the change in value from one (1) time period and four (4) time periods
df%>% 
  dplyr::select(value) %>% 
  mutate(lead1=value-lead(value)) %>% 
  mutate(lead7=value-lead(value, 7))
## # A tibble: 15 × 3
##    value lead1 lead7
##    <int> <int> <int>
##  1    11    -1     4
##  2    12     3     4
##  3     9     1    -2
##  4     8    -3    -1
##  5    11     7     1
##  6     4    -7    -5
##  7    11     4     0
##  8     7    -1    -6
##  9     8    -3    NA
## 10    11     2    NA
## 11     9    -1    NA
## 12    10     1    NA
## 13     9    -2    NA
## 14    11    -2    NA
## 15    13    NA    NA

Ejercicio 5: lead(), mirar hacia adelante

Con el mismo subconjunto de clima (EWR, enero, ordenado por fecha_hora):

  1. Crea humedad_en_3h, el valor de humedad tres horas más adelante.
  2. Crea cambio_humedad, la diferencia entre ese valor futuro y el actual.
  3. ¿Cuántos NA aparecen y en cuál extremo de la tabla están? Explica por qué, comparando con lo que pasó en el ejercicio anterior con lag().
# Escribe tu código aquí

10.8 cumsum

cumsum(), cmean(), cvar() — acumulados.

  • cumsum(x): suma acumulada a lo largo de la columna.
  • cmean() / cvar() (paquete TidyDensity): promedio y varianza acumulados.
  • Uso típico: ver cómo evoluciona un total o un promedio a medida que se añaden datos.

Suma cumulativa: los valores se suman a los largo del vector o columna

set.seed(12345) # set.seed() es para que los datos NO sean al azar y se puede replicar los resultados, tipicamente esto se usa para enseñanzar. 


x <- sample(1:15, 10, replace=TRUE) # sample es para seleccionar valores al azar de un vector

x
##  [1] 14  3 10 12  8 10 13 11  8  2
df=as_tibble(x)
df
## # A tibble: 10 × 1
##    value
##    <int>
##  1    14
##  2     3
##  3    10
##  4    12
##  5     8
##  6    10
##  7    13
##  8    11
##  9     8
## 10     2
df %>% 
  dplyr::select(value) %>% 
  mutate(suma=cumsum(value))
## # A tibble: 10 × 2
##    value  suma
##    <int> <int>
##  1    14    14
##  2     3    17
##  3    10    27
##  4    12    39
##  5     8    47
##  6    10    57
##  7    13    70
##  8    11    81
##  9     8    89
## 10     2    91
url_COVID_PR <- read_csv("Datos/url_COVID_PR.csv")
names(url_COVID_PR)
##  [1] "...1"               "Fecha"              "Muertes"           
##  [4] "IncrementoMuertes"  "CasosPCR_Salud"     "IncCasosPCR_Salud" 
##  [7] "CasosSaludNuevo"    "IncCasosSaludNuevo" "HospitCOV19"       
## [10] "CamasICU"           "CamasICU_disp"      "Ventiladores"      
## [13] "MuertesSalud"       "IncMueSalud"        "VacDoses"          
## [16] "VacAdm"             "N1MoreDoses"        "N2Doses"
head(url_COVID_PR)
## # A tibble: 6 × 18
##    ...1 Fecha   Muertes IncrementoMuertes CasosPCR_Salud IncCasosPCR_Salud
##   <dbl> <chr>     <dbl>             <dbl>          <dbl>             <dbl>
## 1     1 3/12/20       0                 0             NA                NA
## 2     2 3/13/20       0                 0             NA                NA
## 3     3 3/14/20       0                 0             NA                NA
## 4     4 3/15/20       0                 0             NA                NA
## 5     5 3/16/20       0                 0             NA                NA
## 6     6 3/17/20       0                 0             NA                NA
## # ℹ 12 more variables: CasosSaludNuevo <dbl>, IncCasosSaludNuevo <dbl>,
## #   HospitCOV19 <dbl>, CamasICU <dbl>, CamasICU_disp <dbl>, Ventiladores <dbl>,
## #   MuertesSalud <dbl>, IncMueSalud <dbl>, VacDoses <dbl>, VacAdm <dbl>,
## #   N1MoreDoses <dbl>, N2Doses <dbl>
url_COVID_PR %>%
dplyr::select(IncCasosSaludNuevo, CasosSaludNuevo) %>%
mutate(suma=cumsum(IncCasosSaludNuevo))
## # A tibble: 587 × 3
##    IncCasosSaludNuevo CasosSaludNuevo  suma
##                 <dbl>           <dbl> <dbl>
##  1                  2               2     2
##  2                  3               5     5
##  3                  3               8     8
##  4                  0               8     8
##  5                  9              17    17
##  6                  7              24    24
##  7                  6              30    30
##  8                  5              35    35
##  9                 14              49    49
## 10                 12              61    61
## # ℹ 577 more rows

Ejercicio 6: cumsum() con la lluvia

Sigue con clima, origen EWR, mes de enero, ordenado por fecha_hora.

  1. Calcula la lluvia acumulada del mes con cumsum(precipitacion).
  2. ¿Qué le pasa a la suma acumulada si hay un NA en precipitacion? Arréglalo con replace_na() y explica qué supuesto estás haciendo al sustituir por 0.
  3. Grafica la lluvia acumulada contra fecha_hora y describe en palabras la forma de la curva: ¿llovió parejo todo el mes o en pocos eventos?
# Escribe tu código aquí

10.9 cmean() and cvar() del paquete TidyDensity

Para calcular el promedio cumulativo y la varianza

  • las funciones son
  • cmean() # del paquete TidyDensity
  • cvar() # del paquete TidyDensity

Para calcular el promedio en periodos cumulativos

  • rollmean() # del paquete zoo
  • rollapply( ) # del paquete zoo para calcular el rolling varianza

Vea las otras funciones cumulativas en el paquete TidyDensity (cmean, cvar, csd, cmedian, cskewness, ckurtosis): ¿hay otra que podría usar en sus estudios?

set.seed(678)
x <- rnorm(1000, 5, .001)
head(x)
## [1] 4.999227 5.000933 5.000466 4.998915 4.997844 4.999281
df=as_tibble(x)
head(df)
## # A tibble: 6 × 1
##   value
##   <dbl>
## 1  5.00
## 2  5.00
## 3  5.00
## 4  5.00
## 5  5.00
## 6  5.00
mean(df$value)
## [1] 4.999966
# library(MASS)  # innecesario aquí y enmascara dplyr::select(); cmean()/cvar() vienen de TidyDensity
library(TidyDensity)
library(zoo)

df3=df %>% 
  dplyr::select(value) %>% 
  mutate(Prom_cum=cmean(value)) %>% 
  mutate(Var_cum=TidyDensity::cvar(value)) |> 
  mutate(promedio_corriendo= zoo::rollmean(value, k=7, fill=NA, align="left")) |> 
  mutate(varianza_corriendo= zoo::rollapply(value, width=7, FUN=var, fill=NA, align="left"))


df3
## # A tibble: 1,000 × 5
##    value Prom_cum       Var_cum promedio_corriendo varianza_corriendo
##    <dbl>    <dbl>         <dbl>              <dbl>              <dbl>
##  1  5.00     5.00 NaN                         5.00        0.00000139 
##  2  5.00     5.00   0.00000146                5.00        0.00000145 
##  3  5.00     5.00   0.000000778               5.00        0.00000123 
##  4  5.00     5.00   0.000000937               5.00        0.00000133 
##  5  5.00     5.00   0.00000154                5.00        0.00000135 
##  6  5.00     5.00   0.00000124                5.00        0.000000532
##  7  5.00     5.00   0.00000139                5.00        0.000000813
##  8  5.00     5.00   0.00000129                5.00        0.00000139 
##  9  5.00     5.00   0.00000115                5.00        0.00000131 
## 10  5.00     5.00   0.00000113                5.00        0.00000132 
## # ℹ 990 more rows

10.10 Uso de varianza cumulativa en investigación:

Un método para determinar si la cantidad de muestras recolectada es suficiente, es evaluar si la varianza cumulativa sigue cambiando cuando se añade nuevas recolección de datos.

df3$order=c(1:1000)
df3
## # A tibble: 1,000 × 6
##    value Prom_cum       Var_cum promedio_corriendo varianza_corriendo order
##    <dbl>    <dbl>         <dbl>              <dbl>              <dbl> <int>
##  1  5.00     5.00 NaN                         5.00        0.00000139      1
##  2  5.00     5.00   0.00000146                5.00        0.00000145      2
##  3  5.00     5.00   0.000000778               5.00        0.00000123      3
##  4  5.00     5.00   0.000000937               5.00        0.00000133      4
##  5  5.00     5.00   0.00000154                5.00        0.00000135      5
##  6  5.00     5.00   0.00000124                5.00        0.000000532     6
##  7  5.00     5.00   0.00000139                5.00        0.000000813     7
##  8  5.00     5.00   0.00000129                5.00        0.00000139      8
##  9  5.00     5.00   0.00000115                5.00        0.00000131      9
## 10  5.00     5.00   0.00000113                5.00        0.00000132     10
## # ℹ 990 more rows
ggplot(df3, aes(order, Var_cum))+
  geom_point()+
  geom_smooth()


10.11 Que pasa con las funciones cmean, cvar si hay NA en el archivo de datos?

10.11.1 Reemplazar los NA con 0, usando la función replace_na() con un valor específico replace_na(“variable”, 0)

datos_NA=c(1:8, NA, 10:20)
datos_NA=as.data.frame(datos_NA)

datos_NA %>% 
  dplyr::select(datos_NA) %>% 
  mutate(Prom_cum=cmean(datos_NA)) %>% 
 mutate(Var_cum=cvar(datos_NA)) 
##    datos_NA Prom_cum  Var_cum
## 1         1      1.0      NaN
## 2         2      1.5 0.500000
## 3         3      2.0 1.000000
## 4         4      2.5 1.666667
## 5         5      3.0 2.500000
## 6         6      3.5 3.500000
## 7         7      4.0 4.666667
## 8         8      4.5 6.000000
## 9        NA       NA       NA
## 10       10       NA       NA
## 11       11       NA       NA
## 12       12       NA       NA
## 13       13       NA       NA
## 14       14       NA       NA
## 15       15       NA       NA
## 16       16       NA       NA
## 17       17       NA       NA
## 18       18       NA       NA
## 19       19       NA       NA
## 20       20       NA       NA
# Solución para resolver los NA.   Cual problema hay con usar NA?

Ejercicio 7: ¿cuántas observaciones son suficientes?

Este es el uso del ejemplo anterior, pero con datos reales. Toma las primeras 300 filas de temperatura de EWR en enero (ordenadas por fecha_hora).

  1. Añade una columna orden con el número de fila (row_number()).
  2. Calcula el promedio acumulado y la varianza acumulada de temperatura.
  3. Grafica cada uno contra orden.
  4. Según tus gráficas, ¿a partir de cuántas observaciones se estabiliza el promedio? ¿Y la varianza? ¿Cuál de las dos necesita más datos?
# Escribe tu código aquí

10.12 if_else()

La función if_else() es una función de reemplazo de valores en una columna basado en una condición

library(tidyverse)
library(dplyr)

some_data = tibble(day = 1:10)
some_data
## # A tibble: 10 × 1
##      day
##    <int>
##  1     1
##  2     2
##  3     3
##  4     4
##  5     5
##  6     6
##  7     7
##  8     8
##  9     9
## 10    10
some_data |> 
  mutate(day_p = if_else(day %in% c(0:3), "pre", "normal"))
## # A tibble: 10 × 2
##      day day_p 
##    <int> <chr> 
##  1     1 pre   
##  2     2 pre   
##  3     3 pre   
##  4     4 normal
##  5     5 normal
##  6     6 normal
##  7     7 normal
##  8     8 normal
##  9     9 normal
## 10    10 normal
plant_repr=tibble(num_flowers=c(0,0,0,0,1,2,0,1,2,0,2, 100, 1000))

plant_repr
## # A tibble: 13 × 1
##    num_flowers
##          <dbl>
##  1           0
##  2           0
##  3           0
##  4           0
##  5           1
##  6           2
##  7           0
##  8           1
##  9           2
## 10           0
## 11           2
## 12         100
## 13        1000
plant_repr |> 
  mutate(flower_status = if_else(num_flowers == 0, "not reproductive",
                                 "reproductive"))
## # A tibble: 13 × 2
##    num_flowers flower_status   
##          <dbl> <chr>           
##  1           0 not reproductive
##  2           0 not reproductive
##  3           0 not reproductive
##  4           0 not reproductive
##  5           1 reproductive    
##  6           2 reproductive    
##  7           0 not reproductive
##  8           1 reproductive    
##  9           2 reproductive    
## 10           0 not reproductive
## 11           2 reproductive    
## 12         100 reproductive    
## 13        1000 reproductive
plant_repr |> 
  mutate(flower_status = if_else(num_flowers %in% c(0), "not reproductive",
                                 "reproductive"))
## # A tibble: 13 × 2
##    num_flowers flower_status   
##          <dbl> <chr>           
##  1           0 not reproductive
##  2           0 not reproductive
##  3           0 not reproductive
##  4           0 not reproductive
##  5           1 reproductive    
##  6           2 reproductive    
##  7           0 not reproductive
##  8           1 reproductive    
##  9           2 reproductive    
## 10           0 not reproductive
## 11           2 reproductive    
## 12         100 reproductive    
## 13        1000 reproductive
plant_repr |>
  mutate(flower_status = 
           if_else(num_flowers %in% c(0), 
                                 "not reproductive",
           if_else(num_flowers %in% c(1:2), "reproductive",
                                "super reproductive")))
## # A tibble: 13 × 2
##    num_flowers flower_status     
##          <dbl> <chr>             
##  1           0 not reproductive  
##  2           0 not reproductive  
##  3           0 not reproductive  
##  4           0 not reproductive  
##  5           1 reproductive      
##  6           2 reproductive      
##  7           0 not reproductive  
##  8           1 reproductive      
##  9           2 reproductive      
## 10           0 not reproductive  
## 11           2 reproductive      
## 12         100 super reproductive
## 13        1000 super reproductive

Ejercicio 8: if_else() para clasificar

Regresa a millas.

  1. Crea eficiencia con dos categorías: “eficiente” si autopista es 30 o más, y “no eficiente” en los demás casos.
  2. Ahora hazlo con tres categorías usando if_else() anidado: “bajo” (menos de 20), “medio” (20 a 29) y “alto” (30 o más).
  3. Cuenta cuántos vehículos hay en cada categoría por clase. ¿Alguna clase es toda de una sola categoría?
# Escribe tu código aquí

Ejercicio 9 (reto integrador): combinar group_by() con lag()

Con clima completo (los tres aeropuertos, todo el año):

  1. Calcula la temperatura promedio por origen y por día.
  2. Para cada origen por separado, calcula el cambio respecto al día anterior. Ojo: tienes que agrupar por origen antes de usar lag(), o el último día de un aeropuerto se va a restar con el primer día del siguiente.
  3. ¿Cuántos días de cada aeropuerto fueron más calientes que el día anterior?
  4. Enseña con una gráfica o con una tabla por qué el paso 2 estaría mal si no agrupas primero.
# Escribe tu código aquí