6  Flujo de trabajo con R

En este capitulo veremos algunas alternativas para realizar transformaciones utilizando R. Utilizaremos de distintas sintanxis de programación mediante el uso de paquetes y R base.

7 Algunos paquetes sugeridos

A cotinuación veremos el uso de dos paquetes recomendados para análisis de datos ‘Tidyverse’ y ‘data.table’

7.1 Tidyverse

Este es un “paquete de paquetes” que permite cargar una serie de herramientas útiles para el tratamiento de datos. Para profundizar sobre los usos de este paquete se recomienda la lectura de R for Data science.

Es un paquete que puede facilitar el uso inicial de R porque la sintaxis en inglés de compone de funciones como: ‘mutate’ que sirve para crear o editar columnas ( mutar la tabla de datos ), ‘arrange’ que sirve para ordenar, ‘group_by’ para agrupar por categorias y así. Estos ejemplos corresponden a funciones del paquete ‘dplyr’ que se puede cargar de forma individual o con ‘tidyverse’.

7.1.1 Comenzaremos conociendo funciones del paquete ‘dplyr’

  • Características principales:
  1. Enfoque en verbos: dplyr se basa en verbos que describen acciones comunes en la manipulación de datos, como filtrar, seleccionar, ordenar, etc. Esto hace que el código sea más legible y fácil de entender.

  2. Sintaxis “pipe” (%>% o |>): Permite encadenar múltiples operaciones de forma secuencial, lo que facilita la lectura y la escritura del código.

  3. Integración con tidyverse: dplyr funciona a la perfección con otros paquetes del tidyverse, como ggplot2 para visualización y tidyr para la limpieza de datos.

  • Funciones principales:

7.1.2 filter

Cundo cargas el paquete tidyverse aparece un print de pantalla como el siguiente:

Esto nos indica una alerta de conflicto: ‘filter()’ entra en conflicto con la función ‘stats::filter()’ del paquete stats. Esto se debe a que ambas funciones tienen el mismo nombre, ‘stats’ es un paquete que se carga automáticamente con R base.

¿Cómo resolverlo?

Si necesitas usar la función ‘filter()’ de stats, puedes llamarla explícitamente usando ‘stats::filter()’. Si cargas dplyr después de stats, la función ‘filter()’ de dplyr tendrá prioridad. Si consideramos que por lo general ‘dplyr’ o ‘tidyverse’ serán cargados luego de abrir ‘R’, por lo general se cargará posteriormente la función de ‘dplyr’.

  • Ahora veamos un ejemplo del uso de la función con la tabla mtcars que viene cargada en R.
# Primero cargamos la librería tidyverse
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Filtrar los coches con 4 cilindros
dplyr::filter(mtcars, cyl == 4)
                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# Filtrar los coches con más de 100 caballos de fuerza y cambio automático (am = 0)
dplyr::filter(mtcars, hp > 100 & am == 0)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2

Como ves las funciones anteriores no utilizan la ‘pipe’ ( %>% o |>) una alternativa para trabajar con la pipe haciendo lo mismo anterior corresponde a:

# Filtrar los coches con 4 cilindros
mtcars %>%
    dplyr::filter(cyl == 4)
                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# Filtrar los coches con más de 100 caballos de fuerza y cambio automático (am = 0)
mtcars %>%
    dplyr::filter(hp > 100 & am == 0)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2

En los ajemplos anteriores se imprimen todas las filas de filtradas. Como la tabla es corta no resulta problemático, pero con una tabla más grande puede ser poco útil, en ese caso es posible agregar la función ‘head()’

mtcars %>%
    dplyr::filter(hp > 100 & am == 0) %>%
    head(n = 10)
                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Hornet 4 Drive     21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant            18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360         14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280           19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C          17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE         16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL         17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC        15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4

Se puede definir el número de filas a mostrar en ‘head()’ head(n = 10). Si el argumento está vacio se imprimirán las 6 primera filas.

7.1.3 select

La función ‘select’ permite seleccionar columnas específicas de un data frame o tabla.

# Seleccionar las columnas "mpg" (millas por galón), "cyl" (cilindros) y "hp" (caballos de fuerza)
select(mtcars, mpg, cyl, hp) %>%
    head(n = 5)
                   mpg cyl  hp
Mazda RX4         21.0   6 110
Mazda RX4 Wag     21.0   6 110
Datsun 710        22.8   4  93
Hornet 4 Drive    21.4   6 110
Hornet Sportabout 18.7   8 175
# Seleccionar todas las columnas EXCEPTO "qsec" (tiempo en recorrer 1/4 de milla) y "carb" (carburadores)
mtcars %>%
    select(-qsec, -carb) %>%
    head(n = 5)
                   mpg cyl disp  hp drat    wt vs am gear
Mazda RX4         21.0   6  160 110 3.90 2.620  0  1    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875  0  1    4
Datsun 710        22.8   4  108  93 3.85 2.320  1  1    4
Hornet 4 Drive    21.4   6  258 110 3.08 3.215  1  0    3
Hornet Sportabout 18.7   8  360 175 3.15 3.440  0  0    3

7.1.4 arrange

Esta función sirve para ordenar una tabla según una variable.

# Ordenar los coches por consumo de combustible ("mpg") de forma descendente
arrange(mtcars, desc(mpg)) %>%
    head(n = 5)
                mpg cyl disp  hp drat    wt  qsec vs am gear carb
Toyota Corolla 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
Fiat 128       32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic    30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
Lotus Europa   30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2
Fiat X1-9      27.3   4 79.0  66 4.08 1.935 18.90  1  1    4    1
# Ordenar los coches por número de cilindros y luego por caballos de fuerza (ascendente)
mtcars %>%
    arrange(cyl, hp) %>%
    head(n = 5)
                mpg cyl  disp hp drat    wt  qsec vs am gear carb
Honda Civic    30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
Merc 240D      24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
Toyota Corolla 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
Fiat 128       32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
Fiat X1-9      27.3   4  79.0 66 4.08 1.935 18.90  1  1    4    1

7.1.5 mutate

Esta funicón es útil para crear columnas o editar las ya existentes.

# Crear una columna "relacion_hp_peso" (caballos de fuerza / peso)
mutate(mtcars, relacion_hp_peso = hp / wt)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
                    relacion_hp_peso
Mazda RX4                   41.98473
Mazda RX4 Wag               38.26087
Datsun 710                  40.08621
Hornet 4 Drive              34.21462
Hornet Sportabout           50.87209
Valiant                     30.34682
Duster 360                  68.62745
Merc 240D                   19.43574
Merc 230                    30.15873
Merc 280                    35.75581
Merc 280C                   35.75581
Merc 450SE                  44.22604
Merc 450SL                  48.25737
Merc 450SLC                 47.61905
Cadillac Fleetwood          39.04762
Lincoln Continental         39.63864
Chrysler Imperial           43.03087
Fiat 128                    30.00000
Honda Civic                 32.19814
Toyota Corolla              35.42234
Toyota Corona               39.35091
Dodge Challenger            42.61364
AMC Javelin                 43.66812
Camaro Z28                  63.80208
Pontiac Firebird            45.51365
Fiat X1-9                   34.10853
Porsche 914-2               42.52336
Lotus Europa                74.68605
Ford Pantera L              83.28076
Ferrari Dino                63.17690
Maserati Bora               93.83754
Volvo 142E                  39.20863
# Convertir la columna "mpg" a kilómetros por litro (kpl)
mtcars %>%
    mutate(kpl = mpg * 0.425144)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
                          kpl
Mazda RX4            8.928024
Mazda RX4 Wag        8.928024
Datsun 710           9.693283
Hornet 4 Drive       9.098082
Hornet Sportabout    7.950193
Valiant              7.695106
Duster 360           6.079559
Merc 240D           10.373514
Merc 230             9.693283
Merc 280             8.162765
Merc 280C            7.567563
Merc 450SE           6.972362
Merc 450SL           7.354991
Merc 450SLC          6.462189
Cadillac Fleetwood   4.421498
Lincoln Continental  4.421498
Chrysler Imperial    6.249617
Fiat 128            13.774666
Honda Civic         12.924378
Toyota Corolla      14.412382
Toyota Corona        9.140596
Dodge Challenger     6.589732
AMC Javelin          6.462189
Camaro Z28           5.654415
Pontiac Firebird     8.162765
Fiat X1-9           11.606431
Porsche 914-2       11.053744
Lotus Europa        12.924378
Ford Pantera L       6.717275
Ferrari Dino         8.375337
Maserati Bora        6.377160
Volvo 142E           9.098082

7.1.6 summarise

Con dos “m” summarise es una función útil para el calculo de estadísticos de las variables.

# Calcular el promedio de millas por galón ("mpg")
summarise(mtcars, mpg_promedio = mean(mpg))
  mpg_promedio
1     20.09062
# Calcular la desviación estándar de la potencia ("hp")
summarise(mtcars, hp_sd = sd(hp))
     hp_sd
1 68.56287

7.1.7 group_by

Permite agrupar variables y realizar operaciones en esos grupos.

# Agrupar los coches por número de cilindros ("cyl")
group_by(mtcars, cyl)
# A tibble: 32 × 11
# Groups:   cyl [3]
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# ℹ 22 more rows
# Calcular el promedio de millas por galón para cada número de cilindros
mtcars %>%
    group_by(cyl) %>%
    summarise(mpg_promedio = mean(mpg))
# A tibble: 3 × 2
    cyl mpg_promedio
  <dbl>        <dbl>
1     4         26.7
2     6         19.7
3     8         15.1

7.1.8 rename

Esta función permite cambiar el nombre de las columnas, primero debes indicar el nuevo nombre y luego un ‘=’ seguido del nombre actual.

# Cambiar el nombre de la columna "mpg" a "millas_por_galon"
rename(mtcars, millas_por_galon = mpg) %>%
    head(n = 5)
                  millas_por_galon cyl disp  hp drat    wt  qsec vs am gear
Mazda RX4                     21.0   6  160 110 3.90 2.620 16.46  0  1    4
Mazda RX4 Wag                 21.0   6  160 110 3.90 2.875 17.02  0  1    4
Datsun 710                    22.8   4  108  93 3.85 2.320 18.61  1  1    4
Hornet 4 Drive                21.4   6  258 110 3.08 3.215 19.44  1  0    3
Hornet Sportabout             18.7   8  360 175 3.15 3.440 17.02  0  0    3
                  carb
Mazda RX4            4
Mazda RX4 Wag        4
Datsun 710           1
Hornet 4 Drive       1
Hornet Sportabout    2

7.1.9 distinct

# Eliminar las filas duplicadas en función de la columna "cyl"
distinct(mtcars, cyl)
                  cyl
Mazda RX4           6
Datsun 710          4
Hornet Sportabout   8

7.1.10 slice

Esta función permite seleccionar filas específicas de una tabla, complementado con ‘group_by’ permite desarrollar seleccionar elementos por grupos.

# Seleccionar el primer elemento de cada grupo
mtcars %>%
    group_by(cyl) %>%
    slice(1)
# A tibble: 3 × 11
# Groups:   cyl [3]
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
2  21       6   160   110  3.9   2.62  16.5     0     1     4     4
3  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
# Seleccionar las filas 10, 20 y 30
slice(mtcars, c(10, 20, 30))
                mpg cyl  disp  hp drat    wt qsec vs am gear carb
Merc 280       19.2   6 167.6 123 3.92 3.440 18.3  1  0    4    4
Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.9  1  1    4    1
Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6

7.1.11 count

Cuenta el número de filas para cada combinación de variables. Similar a group_by() y summarise(n = n()).

# Contar el número de vehiculos para cada combinación de cilindros ("cyl") y cambio ("am")
count(mtcars, cyl, am)
  cyl am  n
1   4  0  3
2   4  1  8
3   6  0  4
4   6  1  3
5   8  0 12
6   8  1  2

7.1.12 pull

Permite extraer una columna o valor como un vector de datos.

# Extraer la columna "hp" como un vector
hp_vector <- pull(mtcars, hp)

7.1.13 across

Es una función que ayuda a aplicar una función a múltiples columnas.

# Calcular la media de todas las columnas numéricas, usando 'where' y la función 'is.numeric' sin parentesis.

mtcars %>%
    summarise(across(where(is.numeric), mean))
       mpg    cyl     disp       hp     drat      wt     qsec     vs      am
1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 0.40625
    gear   carb
1 3.6875 2.8125

7.1.14 case_when

Esta función permite crear nuevas columnas basadas en condiciones, permite recodificar variables. Se puede combinar con el uso de ‘mutate’

# Crear una columna "categoria_hp" que clasifica los coches según su potencia
mtcars %>%
    mutate(categoria_hp = case_when(
        hp < 100 ~ "Baja",
        hp >= 100 & hp < 200 ~ "Media",
        hp >= 200 ~ "Alta"
    ))
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
                    categoria_hp
Mazda RX4                  Media
Mazda RX4 Wag              Media
Datsun 710                  Baja
Hornet 4 Drive             Media
Hornet Sportabout          Media
Valiant                    Media
Duster 360                  Alta
Merc 240D                   Baja
Merc 230                    Baja
Merc 280                   Media
Merc 280C                  Media
Merc 450SE                 Media
Merc 450SL                 Media
Merc 450SLC                Media
Cadillac Fleetwood          Alta
Lincoln Continental         Alta
Chrysler Imperial           Alta
Fiat 128                    Baja
Honda Civic                 Baja
Toyota Corolla              Baja
Toyota Corona               Baja
Dodge Challenger           Media
AMC Javelin                Media
Camaro Z28                  Alta
Pontiac Firebird           Media
Fiat X1-9                   Baja
Porsche 914-2               Baja
Lotus Europa               Media
Ford Pantera L              Alta
Ferrari Dino               Media
Maserati Bora               Alta
Volvo 142E                 Media

7.1.15 if_else

Esta función es similar a ‘case_when’ solo que sirve para dos condicionales, a menos que se aniden varios ‘if_else’, pero eso puede ser menos legible que la sintaxis de ‘case_when’.

# Crear una columna "potente" que indica si el coche tiene más de 150 caballos de fuerza
mtcars %>%
    mutate(potente = if_else(hp > 150, TRUE, FALSE))
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb potente
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   FALSE
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   FALSE
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   FALSE
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1   FALSE
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2    TRUE
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   FALSE
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4    TRUE
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2   FALSE
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2   FALSE
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4   FALSE
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4   FALSE
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3    TRUE
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3    TRUE
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3    TRUE
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4    TRUE
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4    TRUE
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4    TRUE
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1   FALSE
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2   FALSE
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1   FALSE
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1   FALSE
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2   FALSE
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2   FALSE
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4    TRUE
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2    TRUE
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1   FALSE
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2   FALSE
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2   FALSE
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4    TRUE
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6    TRUE
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8    TRUE
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2   FALSE

7.1.16 Joins

Existen diversas funciones de ‘dplyr’ que permiten ‘fusionar’ bases de datos o planillas, segun sus variables. Estas funciones se puyede agrupar en una familia de ‘join’ dependiendo del uso especifico que queramos podemos utilizar un ’_join’ adecuado.

Visualización de joins en diagrama de venn disponible en etse enlace

Como ejemplo del diagrama anterior podemos tomar el caso de ‘left_join’ al realizar este dipo de unión lo que hacemos es que aquellos elementos del objeto ‘y’ que coinciden con alguno de ‘x’ quedarán en el conjunto, podemos pensar en esto como una variable llemada x, que tiene valores semejantes en y, entonces al hacer ‘left_join’ de x con y, la tabla se quedará con los datos de x más aquellos de y que coincidan.

Si la columna que se usa para unir las tablas tiene diferente nombre en cada data frame, puedes especificar los nombres en el argumento by: by = c(“columna_df1” = “columna_df2”).

Para ver un ejemplo sencillo utilizaremos dos data.frame o tablas, creadas para estos efectos. df1 y df2

df1 <- data.frame(
    ID = c(1, 2, 3, 4),
    nombre = c("Ana", "Juan", "Pedro", "Maria"),
    edad = c(20, 22, 21, 23)
)

df2 <- data.frame(
    ID = c(1, 2, 5),
    calificacion = c(85, 90, 78)
)
  1. Ahora haremos un cruce por la izquierda
left_join(df1, df2, by = "ID")
  ID nombre edad calificacion
1  1    Ana   20           85
2  2   Juan   22           90
3  3  Pedro   21           NA
4  4  Maria   23           NA
  • Conserva todas las filas de df1 (la izquierda).

  • Agrega las columnas de df2 que coinciden con df1 según la columna “ID”.

  • Si no hay coincidencia en df2, las nuevas columnas tendrán valores NA.

  1. Ahora uno por la derecha
right_join(df1, df2, by = "ID")
  ID nombre edad calificacion
1  1    Ana   20           85
2  2   Juan   22           90
3  5   <NA>   NA           78
  • Conserva todas las filas de df2 (la derecha).

  • Agrega las columnas de df1 que coinciden con df2 según la columna “ID”.

  • Si no hay coincidencia en df1, las nuevas columnas tendrán valores NA.

  1. Un cruce que mantiene solo lo que está a la izquierda y derecha.
inner_join(df1, df2, by = "ID")
  ID nombre edad calificacion
1  1    Ana   20           85
2  2   Juan   22           90
  • Conserva solo las filas donde hay coincidencia en ambas tablas según la columna “ID”.
  1. Un cruce que conserva todas las filas de ambas tablas
full_join(df1, df2, by = "ID")
  ID nombre edad calificacion
1  1    Ana   20           85
2  2   Juan   22           90
3  3  Pedro   21           NA
4  4  Maria   23           NA
5  5   <NA>   NA           78
  • Conserva todas las filas de ambas tablas.

  • Si no hay coincidencia, las columnas de la otra tabla tendrán valores NA.

  1. El anti_join devuelve las filas de la primera tabla (df1 en este caso) que no tienen coincidencias en la segunda tabla (df2) según la columna especificada en by (en este caso, “ID”).
anti_join(df1, df2, by = "ID")
  ID nombre edad
1  3  Pedro   21
2  4  Maria   23

Esta función es útil para:

  • Identificar las filas que faltan en una tabla con respecto a otra.

  • Filtrar las filas de una tabla que no se encuentran en otra.

  • Encontrar valores únicos en una tabla que no están presentes en otra.