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.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── 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
 [ reached 'max' / getOption("max.print") -- omitted 2 rows ]
# 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
 [ reached 'max' / getOption("max.print") -- omitted 7 rows ]

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
 [ reached 'max' / getOption("max.print") -- omitted 2 rows ]
# 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
 [ reached 'max' / getOption("max.print") -- omitted 7 rows ]

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
 [ reached 'max' / getOption("max.print") -- omitted 1 rows ]

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
                  relacion_hp_peso
Mazda RX4                    41.98
Mazda RX4 Wag                38.26
Datsun 710                   40.09
Hornet 4 Drive               34.21
Hornet Sportabout            50.87
Valiant                      30.35
Duster 360                   68.63
Merc 240D                    19.44
 [ reached 'max' / getOption("max.print") -- omitted 24 rows ]
# 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    kpl
Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4  8.928
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  8.928
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1  9.693
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  9.098
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2  7.950
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1  7.695
Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4  6.080
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 10.374
 [ reached 'max' / getOption("max.print") -- omitted 24 rows ]

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.09
# Calcular la desviación estándar de la potencia ("hp")
summarise(mtcars, hp_sd = sd(hp))
  hp_sd
1 68.56

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  gear  carb
1 20.09 6.188 230.7 146.7 3.597 3.217 17.85 0.4375 0.4062 3.688 2.812

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
                  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
 [ reached 'max' / getOption("max.print") -- omitted 24 rows ]

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
 [ reached 'max' / getOption("max.print") -- omitted 24 rows ]

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.