Archivio dell'autore: Francesco Cabiddu

Incrociare due tabelle: dplyr::inner_join vs merge

Continuiamo la discussione iniziata in questo post, dove Davide spiegava una procedura per incrociare due tabelle di dati come le due seguenti:

library(tidyverse)


ragione_sociale <- c("comune paperopoli", 
                     "canile pluto", 
                     "archimede pitagorico")
codice_cliente <- c(12345, 67890, 54321)
servizi <- c(4, 5, 2)

servizi_disattivati <- tibble(ragione_sociale, 
                              codice_cliente, 
                              servizi)

 

Tabella clienti

ragione_sociale codice_cliente agente
CANILE DI PLUTO 67890 paperino
ArchimedePitagorico 54321 gastone
Comune di Paperopoli 12345 paperoga

 

Tabella servizi disattivati

ragione_sociale codice_cliente servizi
comune paperopoli 12345 4
canile pluto 67890 5
archimede pitagorico 54321 2

L’obiettivo era quello di aggiungere alla tabella servizi_disattivati la variabile agente appartenente alla tabella clienti, usando come riferimento la variabile codice_cliente comune ad entrambe le tabelle. Il risultato desiderato è il seguente:

ragione_sociale codice_cliente servizi agente
comune paperopoli 12345 4 paperoga
canile pluto 67890 5 paperino
archimede pitagorico 54321 2 gastone

 

Il pacchetto dplyr ci permette di svolgere tale operazione utilizzando le funzioni inner_join e select. Applicata alle nostre tabelle, data la variabile di riferimento codice_cliente, inner_join restituisce tutte le righe di servizi_disattivati corrispondenti a quelle di clienti. Tuttavia tutte le colonne delle tabelle verranno mantenute, per cui se applicassimo solo inner_join otterremmo:

servizi_disattivati %>%
  inner_join(clienti,
             by = "codice_cliente")
ragione_sociale.x codice_cliente servizi ragione_sociale.y agente
comune paperopoli 12345 4 Comune di Paperopoli paperoga
canile pluto 67890 5 CANILE DI PLUTO paperino
archimede pitagorico 54321 2 ArchimedePitagorico gastone

 

Dato che in questo caso le variabili ragione_sociale possiedono valori equivalenti anche se non identici, possiamo decidere di mantenere solo una di queste. Per fare ciò, prima di applicare inner_join scartiamo la variabile ragione_sociale dalla tabella clienti:

servizi_disattivati %>%
  inner_join(clienti %>%
               select(-ragione_sociale),
             by = "codice_cliente")
ragione_sociale codice_cliente servizi agente
comune paperopoli 12345 4 paperoga
canile pluto 67890 5 paperino
archimede pitagorico 54321 2 gastone

 

Uno dei vantaggi più grandi derivanti dall’utilizzo di inner_join è la sua velocità. Per esempio, proviamo a replicare servizi_disattivati per 500000 volte (ottenendo una tabella di 1500000 righe) e poi misuriamo il tempo impiegato dalla funzione merge per completare l’operazione:

start <- proc.time()
servizi_disattivati %>%
  slice(rep(row_number(), 500000)) %>%
  merge(clienti %>%
        select(-ragione_sociale), by.x="codice_cliente", by.y="codice_cliente")
proc.time()[3] - start[3]

elapsed
33.686

E ora proviamo con inner_join:

start <- proc.time()
servizi_disattivati %>%
  slice(rep(row_number(), 500000)) %>%
  inner_join(clienti %>%
               select(-ragione_sociale),
             by = "codice_cliente")
proc.time()[3] - start[3]

elapsed
0.515

In questo caso inner_join risulta circa 65 volte più veloce di merge. Non male!

Un viaggio alla scoperta dei Makers
Roma, dal 3 al 6 Ottobre 2013

Nei prossimi giorni si svolgerà a Roma un evento annuale che racchiude i progressi e l’essenza di un movimento che in questi anni sta modificando il nostro modo di interpretare l’innovazione tecnologica e produttiva.

Il denominatore comune è sempre la condivisione e riutilizzazione delle idee insieme ad nuovo approccio alla produzione basato su tecnologie a basso costo. Infatti i Makers sposano a pieno la filosofia del software e hardware libero (di cui un rappresentante per eccellenza è Arduino) per creare circoli virtuosi di conoscenza ma sopratutto per incentivare nuove realtà economiche.

Maker Faire Rome - The European Edition

La Maker Faire (che attende più di 20.000 visitatori) sarà un evento di presentazione di più di 200 progetti di inventori, fabbers, artigiani e creativi digitali provenienti da tutto il continente europeo (e qualcosa di più) che spazieranno fra stampanti 3D, robot di ultima generazione, moda e design, artigianato, scienza, educazione, green tecnology, digital fabrication e tanto altro ancora.

La fiera (curata da Riccardo Luna e Massimo Banzi) è aperta a tutti in quanto realizzata per avvicinare le famiglie al mondo dell’innovazione e celebrare il Movimento dei “Maker”.

Noi di InsulaR ovviamente parteciperemo come visitatori e cogliamo l’occasione per promuovere e consigliare a tutti questo grande show di tecnologia e innovazione.

Per ulteriori informazioni e per visionare i progetti potete visitare il sito principale dell’evento!