Capítulo7 Transformación: Valores Faltantes

## [1] "2025-09-15"

Fecha de la última revisión

library(tidyverse)
library(datos)

7.1 Valores faltantes

  • NA: Not Available

7.1.1 ¿Qué pasa con los valores faltantes y resultados de anålisis sin sentido?

2^2
## [1] 4
1^2
## [1] 1
1^0
## [1] 1
0^1
## [1] 0
NA^0
## [1] 1
NA^1
## [1] NA
NA == 1
## [1] NA
NA | TRUE
## [1] TRUE
NA | FALSE
## [1] NA
FALSE & NA
## [1] FALSE
TRUE & NA
## [1] NA
FALSE * NA
## [1] NA
TRUE * NA
## [1] NA
NA * 0
## [1] NA
NA * 1
## [1] NA
12 * 3
## [1] 36
NA - 3
## [1] NA

7.2 Creeamos un df para aclarar estas operaciones con NA en un data frame

  • valores numéricos
  • variable lógica TRUE/FALSE
  • variable con NA y 0/1
df=tribble(~values, ~T_F, ~NA_not,
             1, TRUE, NA,
             0, TRUE, 1,
             1, FALSE, NA,
             0, FALSE, 1,
             0, TRUE, 1,
             0, FALSE, 0,
             NA, NA, NA)

df
## # A tibble: 7 × 3
##   values T_F   NA_not
##    <dbl> <lgl>  <dbl>
## 1      1 TRUE      NA
## 2      0 TRUE       1
## 3      1 FALSE     NA
## 4      0 FALSE      1
## 5      0 TRUE       1
## 6      0 FALSE      0
## 7     NA NA        NA

Ahora multiplicamos valores con la variable lógica.

df |>
  mutate(values_TF = values * T_F)
## # A tibble: 7 × 4
##   values T_F   NA_not values_TF
##    <dbl> <lgl>  <dbl>     <dbl>
## 1      1 TRUE      NA         1
## 2      0 TRUE       1         0
## 3      1 FALSE     NA         0
## 4      0 FALSE      1         0
## 5      0 TRUE       1         0
## 6      0 FALSE      0         0
## 7     NA NA        NA        NA

Multiplicamos la variable lógica con NA/1/0

df |>
  mutate(values_TF = T_F * NA_not)
## # A tibble: 7 × 4
##   values T_F   NA_not values_TF
##    <dbl> <lgl>  <dbl>     <dbl>
## 1      1 TRUE      NA        NA
## 2      0 TRUE       1         1
## 3      1 FALSE     NA        NA
## 4      0 FALSE      1         0
## 5      0 TRUE       1         1
## 6      0 FALSE      0         0
## 7     NA NA        NA        NA

Multiplicamos valores con la variable NA/1/0

df |>
  mutate(valuesNA = values * NA_not)
## # A tibble: 7 × 4
##   values T_F   NA_not valuesNA
##    <dbl> <lgl>  <dbl>    <dbl>
## 1      1 TRUE      NA       NA
## 2      0 TRUE       1        0
## 3      1 FALSE     NA       NA
## 4      0 FALSE      1        0
## 5      0 TRUE       1        0
## 6      0 FALSE      0        0
## 7     NA NA        NA       NA

7.3 Contabilizar los NA

  • ¿Cuántos vuelos tienen datos faltantes en horario_salida?
  • ¿Qué otras variables tienen valores faltantes?
  • ¿Qué representan estas filas?
vuelos %>%
  dplyr::select(horario_salida, aerolinea) %>%
  is.na() %>%
  table()
## .
##  FALSE   TRUE 
## 665297   8255

7.4 Seleccionar solamente los vuelos donde el “horario de salida” es desconocido

vuelos %>%
  dplyr::select(anio, mes, dia, horario_salida, aerolinea) |>
  filter(is.na(horario_salida)) %>%
  group_by(dia) %>%
  summarise(n = n())
## # A tibble: 31 × 2
##      dia     n
##    <int> <int>
##  1     1   246
##  2     2   250
##  3     3   109
##  4     4    82
##  5     5   226
##  6     6   296
##  7     7   318
##  8     8   921
##  9     9   593
## 10    10   535
## # ℹ 21 more rows

7.5 Otras funciones: NA

  • na.rm=TRUE
  • !is.na() = is not NA, pq al frente tiene “!”
no_cancelados <- vuelos %>%
  filter(!is.na(atraso_salida), !is.na(atraso_llegada))
no_cancelados
## # A tibble: 327,346 × 19
##     anio   mes   dia horario_salida salida_programada atraso_salida
##    <int> <int> <int>          <int>             <int>         <dbl>
##  1  2013     1     1            517               515             2
##  2  2013     1     1            533               529             4
##  3  2013     1     1            542               540             2
##  4  2013     1     1            544               545            -1
##  5  2013     1     1            554               600            -6
##  6  2013     1     1            554               558            -4
##  7  2013     1     1            555               600            -5
##  8  2013     1     1            557               600            -3
##  9  2013     1     1            557               600            -3
## 10  2013     1     1            558               600            -2
## # ℹ 327,336 more rows
## # ℹ 13 more variables: horario_llegada <int>, llegada_programada <int>,
## #   atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## #   origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## #   hora <dbl>, minuto <dbl>, fecha_hora <dttm>
#vuelos %>% 
#  drop_na(atraso_salida, atraso_llegada) 

no_cancelados %>%
  group_by(anio, mes, dia) %>%
  summarise(mean = mean(atraso_salida))
## # A tibble: 365 × 4
## # Groups:   anio, mes [12]
##     anio   mes   dia  mean
##    <int> <int> <int> <dbl>
##  1  2013     1     1 11.4 
##  2  2013     1     2 13.7 
##  3  2013     1     3 10.9 
##  4  2013     1     4  8.97
##  5  2013     1     5  5.73
##  6  2013     1     6  7.15
##  7  2013     1     7  5.42
##  8  2013     1     8  2.56
##  9  2013     1     9  2.30
## 10  2013     1    10  2.84
## # ℹ 355 more rows
vuelos %>%
  group_by(anio, mes, dia) %>%
  summarise(
    mean = mean(atraso_salida, na.rm = TRUE),
    max = max(atraso_salida, na.rm = TRUE),
    n = n()
  )
## # A tibble: 365 × 6
## # Groups:   anio, mes [12]
##     anio   mes   dia  mean   max     n
##    <int> <int> <int> <dbl> <dbl> <int>
##  1  2013     1     1 11.5    853   842
##  2  2013     1     2 13.9    379   943
##  3  2013     1     3 11.0    291   914
##  4  2013     1     4  8.95   288   915
##  5  2013     1     5  5.73   327   720
##  6  2013     1     6  7.15   202   832
##  7  2013     1     7  5.42   366   933
##  8  2013     1     8  2.55   188   899
##  9  2013     1     9  2.28  1301   902
## 10  2013     1    10  2.84  1126   932
## # ℹ 355 more rows

Reemplazar los NA por “0” en el archivo de datos

Cual es el problema de reemplazar los NA por 0?

datos_NA = c(1, NA, 3:8, NA, 10:12)


datos_NA_df = as.data.frame(datos_NA)
datos_NA_df
##    datos_NA
## 1         1
## 2        NA
## 3         3
## 4         4
## 5         5
## 6         6
## 7         7
## 8         8
## 9        NA
## 10       10
## 11       11
## 12       12
# reemplazar NA con 0

datos_NA_df = datos_NA_df %>%
  mutate(datos_0 = if_else(is.na(datos_NA), 99, datos_NA))


datos_NA_df
##    datos_NA datos_0
## 1         1       1
## 2        NA      99
## 3         3       3
## 4         4       4
## 5         5       5
## 6         6       6
## 7         7       7
## 8         8       8
## 9        NA      99
## 10       10      10
## 11       11      11
## 12       12      12

AHORA

Alguin le dio un set de datos en Excel con O cuando no tenian datos

reemplace los valores de “zero” con NA con la funcion if_else de dplyr

library(dplyr)
Datos_Excel = c(1, 0, 3:8, 0, 10:12)

Datos_df = as.data.frame(Datos_Excel)

Datos_df = Datos_df %>%
  mutate(Datos_NA = dplyr::if_else(Datos_Excel == 0, NA, Datos_Excel))

Datos_df
##    Datos_Excel Datos_NA
## 1            1        1
## 2            0       NA
## 3            3        3
## 4            4        4
## 5            5        5
## 6            6        6
## 7            7        7
## 8            8        8
## 9            0       NA
## 10          10       10
## 11          11       11
## 12          12       12