Cápsula 8

1 Unión de datos

La unión de datos mediante el uso de funciones de join es una técnica fundamental que se utiliza cuando trabajamos con conjuntos de datos que contienen información relacionada, pero almacenada en diferentes tablas o fuentes. En R, la función join (disponible a través del paquete dplyr) permite combinar estos conjuntos de datos.

El concepto de join se basa en la idea de combinación de filas de dos o más tablas basadas en una o más columnas comunes.

Existen varios tipos de join, que determinan cómo se manejarán las filas no coincidentes entre las tablas. Los más comunes son:

  • Inner Join (inner_join()): Devuelve solo las filas que tienen coincidencias en ambas tablas.

  • Left Join (left_join()): Devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha. Si no hay coincidencia en la tabla derecha, se rellena con NA.

  • Right Join (right_join()): Devuelve todas las filas de la tabla derecha y las filas coincidentes de la tabla izquierda. Si no hay coincidencia en la tabla izquierda, se rellena con NA.

  • Full Join (full_join()): Devuelve todas las filas de ambas tablas, rellenando con NA donde no haya coincidencias.

Estas funciones estan descriptas en el material de lectura Material Funciones donde tambien pueden encontrar un gráfico que ayuda a comprender la base de las uniones de datos.

Tomar cuidado ya que las uniones son específicas para cada caso. Por lo tanto, es útil convertir todos los valores a minúsculas o mayúsculas antes de realizar la unión. Ver material de Limpieza de datos.

1.1 Uniones izquierda y derecha

Las uniones izquierda o derecha se utilizan comúnmente para agregar información a un marco de datos: la información nueva se agrega solo a las filas que ya existían en el marco de datos de referencia.

Al utilizar estas uniones, el orden escrito de los marcos de datos en el comando es importante*.

  • En una unión izquierda , el primer marco de datos escrito es el de referencia
  • En una unión derecha , el segundo marco de datos escrito es el de referencia

Se conservan todas las filas del marco de datos de referencia. La información del otro marco de datos (secundario) se une al marco de datos de referencia solo si existe una coincidencia a través de las columnas de identificador.

Hay que tener en cuenta que:

  • las filas del marco de datos secundario que no coinciden se eliminan.
  • Si una fila de base coincide con varias filas en el marco de datos secundario (uno a muchos), se dan todas las combinaciones, lo que significa que se pueden agregar nuevas filas al marco de datos devuelto.
  • Si hay muchas filas de línea base que coinciden con una fila en el marco de datos secundario (muchos a uno), la información secundaria se agrega a cada fila de línea base coincidente.

Fig-1 Left join()

Fig-2 right join()

Fuente de las imágenes

1.1.1 Ejemplo con left_join()

Una de las funciones más utilizadas es left_join(). Vamos a ver un ejemplo, continuando con nuestro marco de datos.

Si queremos unir nuestro marco de datos ira con otro marco de datos que contiene información sobre vacunación (teniendo en cuenta que el ID del paciente se corresponde con el de ira), podemos realizar un left_join(). Pero primero, crearemos el segundo marco de datos.

# Crear un nuevo marco de datos con información sobre vacunación

vacunacion <- data.frame(
  Paciente_ID = c(1, 2, 3, 4),
  Vacuna_Aplicada = c("Sí", "Sí", "Sí", "No"),
  Tipo_Vacuna = c(
    "Influenza",
    "na",
    "COVID-19",
    "COVID-19"
  )
)



Unión por Paciente_ID: Usamos la función left_join() para unir los data frames ira y vacunacion basándonos en la columna Paciente_ID, que es común a ambos data frames.

Esto asegura que cada fila en ira se combine con la información correspondiente en vacunacion, siempre que exista una coincidencia en el Paciente_ID.

library(dplyr)

df_unido <- ira %>%
  left_join(vacunacion, by = "Paciente_ID")



En este caso vemos que:

  • Coincidencia de claves: La función busca coincidencias entre las filas de los dos data frames, basándose en la columna clave especificada. Si hay una coincidencia entre el valor de la columna clave en ambos data frames, esa fila se combina.

  • Filas adicionales: Si una fila de un data frame no encuentra una coincidencia en el otro data frame, la fila del primer data frame (en el caso de left_join()) se mantiene, pero las columnas de la parte no coincidente se llenarán con NA.

1.2 Unión completa e interna

Unión completa: devuelve todas las filas de ambos marcos de datos.

Si hay filas presentes en una y no en la otra (donde no se encontró ninguna coincidencia), el marco de datos las incluirá y se alargará el marco de datos, se rellenerá con NA los valores faltantes.

Unión interna: devuelve solo filas con coincidencias en ambos marcos de datos.

Esto significa que la cantidad de filas en el marco de datos de referencia puede reducirse. El ajuste de qué marco de datos es el “de referencia” (escrito primero en la función) no afectará las filas que se devuelven, pero sí afectará el orden de las columnas, el orden de las filas y las columnas de identificadores que se conservan.

Fig-3 full join()

Fig-4 inner join()

1.3 Unión de filtrado

Anti_join es otra “unión de filtrado” que devuelve filas en el marco de datos de referencia que no tienen una coincidencia en el marco de datos secundario.

A veces necesitamos identificar registros que no están presentes en otro marco de datos, la solución de problemas ortográficos en una unión (revisar registros que deberían haber coincidido) y examinar registros que fueron excluidos después de otra unión.

Al igual que con right_join()y left_join(), el marco de datos de referencia (que aparece primero) es importante. Las filas devueltas son solo del marco de datos de referencia.

En el gif a continuación que la fila del marco de datos secundario (fila violeta 4) no se devuelve a pesar de que no coincide con la línea base.

Fig-4 anti join()

2 Añadir Filas

Para vincular filas de un marco de datos a la parte inferior de otro marco de datos, se puede utilizar bind_rows() del paquete dplyr.

Puede utilizar bind_rows() debemos tener estructuras similares en nuestro marco de datos para combinarlos en un solo marco de datos.

Un ejemplo común de vinculación de filas es vincular una fila de “total” a una tabla descriptiva creada con la función dplyr summarise().

Veamos un ejemplo ai quisieramos preparar una tabla resumen con totales de los datos agrupados que tenemos en ira_agrupado.

# Calcular el total de hospitalizaciones
total_hospitalizaciones <- sum(ira_agrupado$hospitalizaciones, na.rm = TRUE)

# Crear una fila con el total, manteniendo la estructura de las otras columnas
total <- data.frame(
  Rango_Edad = "Total",  # Aquí asignas "Total" o el valor correspondiente a la columna de rango
  hospitalizaciones = total_hospitalizaciones
)

# Agregar la fila de totales al data frame original
ira_con_totales <- bind_rows(ira_agrupado, total)