Come unire i dati in R utilizzando R merge, dplyr o data.table

R ha una serie di modi veloci ed eleganti per unire frame di dati da una colonna comune. Vorrei mostrarvi tre di loro:

  • la merge()funzione di base R ,
  • dplyr si unisce alla famiglia di funzioni e
  • sintassi delle parentesi di data.table.

Ottieni e importa i dati

Per questo esempio userò uno dei miei set di dati demo preferiti: i tempi di ritardo dei voli dall'US Bureau of Transportation Statistics. Se vuoi seguire, vai su //bit.ly/USFlightDelays e scarica i dati per il periodo di tempo che preferisci con le colonne Flight Date , Reporting_Airline , Origin , Destination e DepartureDelayMinutes . Ottieni anche la tabella di ricerca per Reporting_Airline .

In alternativa, scarica questi due set di dati, più il mio codice R in un unico file e un PowerPoint che spiega diversi tipi di unione di dati, qui:

scarica codice, dati e PowerPoint per come unire i dati in R Include diversi file di dati, uno script PowerPoint e R per accompagnare l'articolo. Sharon Machlis

Per leggere il file con la base R, prima decomprimerei il file del ritardo del volo e quindi importerei sia i dati del ritardo del volo che il file di ricerca del codice con read.csv(). Se stai eseguendo il codice, il file di ritardo che hai scaricato avrà probabilmente un nome diverso rispetto al codice seguente. Inoltre, nota l' .csv_estensione insolita del file di ricerca .

decomprimere ("673598238_T_ONTIME_REPORTING.zip")

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

sep = ",", quote = "\" ")

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

quote = "\" ", sep =", ")

Successivamente, darò un'occhiata a entrambi i file 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) Codice Descrizione 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 orientale

Si fonde con la base R

Il frame di dati del ritardo mydf contiene solo le informazioni sulla compagnia aerea in base al codice. Vorrei aggiungere una colonna con i nomi delle compagnie aeree da mylookup. Un modo di base R per farlo è con la merge()funzione, usando la sintassi di base merge(df1, df2). Non importa l'ordine del frame di dati 1 e del frame di dati 2, ma il primo è considerato x e il secondo è y. 

Se le colonne da cui vuoi unirti non hanno lo stesso nome, devi dire a merge quali colonne vuoi unire: by.xper il nome della colonna del frame di dati x e by.yper quello y, come merge(df1, df2, by.x = "df1ColName", by.y = "df2ColName").

Puoi anche dire a merge se vuoi tutte le righe, comprese quelle senza corrispondenza, o solo le righe che corrispondono, con gli argomenti all.xe all.y. In questo caso, vorrei tutte le righe dai dati di ritardo; se non c'è il codice della compagnia aerea nella tabella di ricerca, voglio comunque le informazioni. Ma non ho bisogno di righe dalla tabella di ricerca che non sono nei dati di ritardo (ci sono alcuni codici per vecchie compagnie aeree che non volano più lì dentro). Quindi, all.xuguale TRUEma all.yuguale FALSE. Codice completo:

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

by.y = "Code", all.x = TRUE, all.y = FALSE)

Il nuovo data frame unito include una colonna denominata Descrizione con il nome della compagnia aerea in base al codice del vettore.

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

Si unisce a dplyr

dplyr utilizza la sintassi del database SQL per le sue funzioni di join. Un join sinistro  significa: include tutto a sinistra (qual era il frame di dati x in merge()) e tutte le righe che corrispondono dal frame di dati destro (y). Se le colonne di join hanno lo stesso nome, tutto ciò di cui hai bisogno è left_join(x, y). Se non hanno lo stesso nome, è necessario un byargomento, ad esempio left_join(x, y, by = c("df1ColName" = "df2ColName")).

Nota la sintassi per by: È un vettore con nome, con i nomi delle colonne di sinistra e destra tra virgolette.

Il codice per importare e unire entrambi i set di dati utilizzando left_join()è di seguito. Inizia caricando i pacchetti dplyr e readr e quindi legge i due file con read_csv(). Durante l'utilizzo read_csv(), non è necessario prima decomprimere il file.

libreria (dplyr)

libreria (readr)

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

mylookup_tibble <- read_csv ("L_UNIQUE_CARRIERS.csv_")

join_tibble <- left_join (mytibble, mylookup_tibble,

di = c ("OP_UNIQUE_CARRIER" = "Codice"))

read_csv()crea tavole , che sono un tipo di frame di dati con alcune funzionalità extra. left_join()unisce i due. Dai un'occhiata alla sintassi: in questo caso, l'ordine è importante. left_join()significa includere tutte le righe a sinistra o il primo set di dati, ma solo le righe che corrispondono al secondo . E, poiché ho bisogno di unire da due colonne con nomi diversi, ho incluso un byargomento.

Possiamo guardare la struttura del risultato con la glimpse()funzione dplyr , che è un altro modo per vedere i primi pochi elementi di un data frame.

glimpse (join_tibble) Osservazioni: 658.461 Variabili: 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 ",… $ ORIGIN" 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,… $ Descrizione "Delta Air Lines Inc.", "Delta Air Lines Inc.", "Delta Air ...

Questo set di dati unito ora ha una nuova colonna con il nome della compagnia aerea. Se esegui tu stesso una versione di questo codice, probabilmente noterai che dplyr era molto più veloce della base R.

Successivamente, diamo un'occhiata a un modo super veloce per eseguire i join.