library(tidyverse) library(datos) # En general, tendremos muchas bases de datos que manejar simultáneamente. # Tenemos herramientas para combinar toda la información de manera elegante # Bases de datos vinculadas a 'vuelos' aerolineas aeropuertos aviones clima # Clave (Key): (conjunto de) variable(s) que identifica una observación # de manera única # Clave primaria: identifica de manera única cada observación en su tabla # Clave foránea: identifica observaciones de otra tabla # Una clave primaria junto con su correspondiente foránea forman una "relación" # Es importante identificar claves en nuestras bases de datos. # Uno puede asumir desde el sentido común que una clave es primaria, # pero si hay errores en la base de datos, puede generar problemams. # Para verificar que unan clave es primaria: aviones %>% count(codigo_cola) %>% filter(n > 1) aviones %>% summarise(sum(is.na(codigo_cola))) # 'codigo_cola' es primaria clima %>% count(anio, mes, dia, hora, origen) %>% filter(n > 1) # la combinación de esas variables no es una clave primaria # Si la base de datos no tiene clave primaria, creamos una vuelos %>% count(anio, mes, dia, vuelo) %>% filter(n > 1) vuelos %>% count(anio, mes, dia, codigo_cola) %>% filter(n > 1) vuelos_clave = vuelos %>% mutate(Clave = row_number()) vuelos_clave$Clave # 'Clave' es una clave subrogada # Sabiendo esto, usaremos funciones 'join' para juntar la información # de dos bases de datos, uniendo a través de una clave vuelos2 <- vuelos %>% select(anio:dia, hora, origen, destino, codigo_cola, aerolinea) vuelos2 # achicamos un poco la base de datos original # Tenemos varias maneras de unir dos bases de datos a partir de una clave común # 'left_join' para mantener la información de la base de datos izquierda # 'right_join' análogo para base de datos derecha # 'inner_join' mantiene los valores de claves comunes a ambas tablas # 'full_join' mantiene todos los valores de claves vuelos2 %>% select(-origen, -destino) %>% left_join(aerolineas, by = "aerolinea") vuelos2 %>% left_join(clima) # Toma todas las columnas comunes como clave vuelos2 %>% left_join(aviones, by = "codigo_cola") # Toma como clave solo 'codigo_cola' vuelos2 %>% left_join(aeropuertos, c("origen" = "codigo_aeropuerto")) # Cuando los valores de las columnas son comunes, pero los nombres de columnas no # También podemos unir según observaciones, en vez de variables # 'semi_join' para mantener observaciones en tabla izquierda que también están en tabla derecha # 'anti_join' es igual a semi_join, pero descarta en vez de mantener destinos_populares <- vuelos %>% count(destino, sort = TRUE) %>% head(10) destinos_populares vuelos %>% semi_join(destinos_populares) # Un buen truco es usar 'anti_join' para verificar que no hay elementos de una clave foránea que no estén en la clave primaria # También podemos aplicar operaciones de conjuntos a las bases de datos # 'intersect' devuelve observaciones comunes a las dos bases de datos # 'union' devuelve observaciones en al menos una base de datos # 'setdiff' devuelve las observaciones que están en la tabla izquierda y no en la derecha