Cómo fusionar datos en R usando R merge, dplyr o data.table

R tiene varias formas rápidas y elegantes de unir marcos de datos en una columna común. Me gustaría mostrarles tres de ellos:

  • función de la base R merge(),
  • la familia de funciones de unión de dplyr, y
  • sintaxis de corchetes de data.table.

Obtener e importar los datos

Para este ejemplo, usaré uno de mis conjuntos de datos de demostración favoritos: los tiempos de retraso de los vuelos de la Oficina de Estadísticas de Transporte de EE. UU. Si desea seguir adelante, diríjase a //bit.ly/USFlightDelays y descargue datos para el período de tiempo que elija con las columnas Fecha de vuelo , Línea aérea de informes , Origen , Destino y Minutos de retraso de salida . Obtenga también la tabla de búsqueda para Reporting_Airline .

O descargue estos dos conjuntos de datos, más mi código R en un solo archivo y un PowerPoint que explica los diferentes tipos de fusiones de datos, aquí:

descargue Código, datos y PowerPoint para saber cómo combinar datos en R Incluye varios archivos de datos, una secuencia de comandos de PowerPoint y R para acompañar el artículo. Sharon Machlis

Para leer el archivo con base R, primero descomprimiría el archivo de retraso de vuelo y luego importaría tanto los datos de retraso de vuelo como el archivo de búsqueda de código con read.csv(). Si está ejecutando el código, el archivo de demora que descargó probablemente tendrá un nombre diferente al del código siguiente. Además, tenga en cuenta la .csv_extensión inusual del archivo de búsqueda .

descomprimir ("673598238_T_ONTIME_REPORTING.zip")

mydf <- read.csv ("673598238_T_ONTIME_REPORTING.csv",

sep = ",", cita = "\" ")

mylookup <- read.csv ("L_UNIQUE_CARRIERS.csv_",

cita = "\" ", sep =", ")

A continuación, echaré un vistazo a ambos archivos con head():

head (mydf) FL_DATE OP_UNIQUE_CARRIER ORIGIN DEST DEP_DELAY_NEW X 1 2019-08-01 DL ATL DFW 31 NA 2 2019-08-01 DL DFW ATL 0 NA 3 2019-08-01 DL IAH ATL 40 NA 4 2019-08-01 DL PDX SLC 0 NA 5 2019-08-01 DL SLC PDX 0 NA 6 2019-08-01 DL DTW ATL 10 NA

head (mylookup) Código Descripción 1 02Q Titan Airways 2 04Q Tradewind Aviation 3 05Q Comlux Aviation, AG 4 06Q Master Top Linhas Aereas Ltd. 5 07Q Flair Airlines Ltd. 6 09Q Swift Air, LLC d / b / a Eastern Air Lines d / b / a oriental

Se fusiona con la base R

El marco de datos de retraso mydf solo tiene información de la aerolínea por código. Me gustaría agregar una columna con los nombres de las aerolíneas mylookup. Una forma básica de R para hacer esto es con la merge()función, usando la sintaxis básica merge(df1, df2). No importa el orden de la trama de datos 1 y la trama de datos 2, pero cualquiera que sea el primero se considera x y el segundo es y. 

Si las columnas por las que desea unirse no tienen el mismo nombre, debe indicarle a fusionar las columnas por las que desea unirse: by.xpara el nombre de la columna del marco de datos x y by.ypara la y, como merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

También puede decirle a fusionar si desea todas las filas, incluidas las que no coinciden, o solo las filas que coinciden, con los argumentos all.xy all.y. En este caso, me gustaría todas las filas de los datos de retraso; si no hay un código de línea aérea en la tabla de búsqueda, todavía quiero la información. Pero no necesito filas de la tabla de búsqueda que no estén en los datos de demora (hay algunos códigos para aerolíneas antiguas que ya no vuelan allí). Entonces, all.xes igual TRUEpero all.yes igual FALSE. Código completo:

join_df <- fusionar (mydf, mylookup, by.x = "OP_UNIQUE_CARRIER",

by.y = "Código", all.x = TRUE, all.y = FALSE)

El nuevo marco de datos unido incluye una columna denominada Descripción con el nombre de la aerolínea según el código de la aerolínea.

head (join_df) OP_UNIQUE_CARRIER FL_DATE ORIGIN DEST DEP_DELAY_NEW X Descripción 1 9E 2019-08-12 JFK SYR 0 NA Endeavour Air Inc. 2 9E 2019-08-12 TYS DTW 0 NA Endeavor Air Inc. 3 9E 2019-08-12 ORF LGA 0 NA Endeavour Air Inc. 4 9E 2019-08-13 IAH MSP 6 NA Endeavour Air Inc. 5 9E 2019-08-12 DTW JFK 58 NA Endeavour Air Inc. 6 9E 2019-08-12 SYR JFK 0 NA Endeavour Air Inc .

Se une con dplyr

dplyr utiliza la sintaxis de la base de datos SQL para sus funciones de unión. Una combinación a la izquierda  significa: Incluir todo lo que está a la izquierda (en qué estaba el marco de datos x merge()) y todas las filas que coinciden con el marco de datos derecho (y). Si las columnas de combinación tienen el mismo nombre, todo lo que necesita es left_join(x, y). Si no tienen el mismo nombre, necesita un byargumento, como left_join(x, y, by = c("df1ColName" = "df2ColName")).

Tenga en cuenta la sintaxis de by: Es un vector con nombre, con los nombres de las columnas izquierda y derecha entre comillas.

El código para importar y fusionar ambos conjuntos de datos se left_join()encuentra a continuación. Comienza cargando los paquetes dplyr y readr y luego lee los dos archivos con read_csv(). Cuando lo uso read_csv(), no necesito descomprimir el archivo primero.

biblioteca (dplyr)

biblioteca (readr)

mytibble <- read_csv ("673598238_T_ONTIME_REPORTING.zip")

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

Join_tibble <- left_join (mytibble, mylookup_tibble,

by = c ("OP_UNIQUE_CARRIER" = "Código"))

read_csv()crea tibbles , que son un tipo de marco de datos con algunas características adicionales. left_join()fusiona los dos. Eche un vistazo a la sintaxis: en este caso, el orden importa. left_join()los medios incluyen todas las filas de la izquierda, o el primer conjunto de datos, pero solo las filas que coinciden con el segundo . Y, como necesito unirme por dos columnas con nombres diferentes, incluí un byargumento.

Podemos observar la estructura del resultado con la glimpse()función de dplyr , que es otra forma de ver los primeros elementos de un marco de datos.

glimpse (join_tibble) Observaciones: 658,461 Variables: 7 $ FL_DATE 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01, 2019-08-01… $ OP_UNIQUE_CARRIER "DL", "DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL "," DL ",… $ ORIGEN" ATL "," DFW "," IAH "," PDX "," SLC "," DTW "," ATL "," MSP "," JF… $ DEST "DFW", "ATL", "ATL", "SLC", "PDX", "ATL", "DTW "," JFK "," MS… $ DEP_DELAY_NEW 31, 0, 40, 0, 0, 10, 0, 22, 0, 0, 0, 17, 5, 2, 0, 0, 8, 0,… $ X6 NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… $ Descripción "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air…

Este conjunto de datos unidos ahora tiene una nueva columna con el nombre de la aerolínea. Si ejecuta una versión de este código usted mismo, probablemente notará que dplyr fue mucho más rápido que la base R.

A continuación, veamos una forma súper rápida de hacer uniones.