Incrociare due tabelle di dati

Incrociare diverse tabelle di dati è un problema che solitamente si presenta quando i dati vengono raccolti da più persone, ognuna delle quali si occupa della gestione di un aspetto informativo diverso. Di recente mi sono scontrato con questo problema in una collaborazione con un’azienda. La situazione era questa: se da una parte mi veniva fornito un dataset che conteneva i dati identificativi dei clienti, dall’altra mi veniva girato un file che indicava il numero di servizi a cui alcuni clienti avevano rinunciato.

Ho ricostruito un esempio prototipico: il dataset CB contiene i dati identificativi dei clienti, mentre il dataset Deact contiene il numero di servizi disattivati dai clienti. Le tabelle sono visualizzate nell’immagine sottostante (è abbastanza evidente che i dati sono inventati!).

Esempio dati

Per ricreare in R i due dataset è sufficiente copiare e incollare nel terminale i comandi riportati nel riquadro seguente.


CB <- data.frame( Nome.Cliente = c("Deposito di Paperon de Paperoni","Comune di Paperopoli", "Banca Rockerduck", "Laboratorio di Archimede Pitagorico", "Giovani Marmotte ONLUS", "Fattoria di Nonna Papera & Ciccio", "Covo della Banda Bassotti", "Canile Pluto SNC"), Codice.cliente = c("12621", "56352", "21098", "27934", "10782", "87192", "54891", "32609"), Agente = c("Paperino", "Gastone", "Paperoga", "Paperino", "Paperoga", "Paperoga", "Gastone", "Gastone") ) Deact <- data.frame( Ragione.Sociale = c("Comune di Paperopoli", "Canile Pluto", "Archimede Pitagorico", "Banca di Rockerduck"), Codice.cliente = c("56352", "32609", "27934", "21098"), Servizi = c(4, 5, 2, 7) ) [/code]

Ogni cliente è identificato attraverso un codice univoco, riportato nelle tabelle alla voce “Codice cliente”. Se tra un dataset e l’altro il nome del cliente può variare leggermente, il codice è un metodo sicuro per identificare il cliente.

A ogni cliente è associato un commerciale di riferimento, ovvero un agente che ce l’ha in carico e ha il compito di gestirlo. Proprio quest’ultima informazione non è inserita nella tabella Deact: in questo post vedremo come associare l’agente di riferimento a ognuno dei clienti che ha rinunciato a un qualche servizio. Per risolvere il problema, assumeremo il dataset Deact come base e vi aggiungeremo una nuova colonna che conterrà l’agente associato a ogni cliente; i nomi degli agenti saranno estrapolati dal dataset CB, utilizzando la colonna “Codice cliente” come chiave di ricerca.

Per mettere in associazione due tabelle di dati, utilizzando come chiave di ricerca una colonna comune alle due, si utilizza la funzione match. Dati due vettori, la funzione match restituisce le posizioni degli elementi del primo vettore sul secondo. In pratica, dati due vettori x1 e x2, match cerca in quale posizione di x2 si trovano gli elementi di x1.

Nel nostro caso, dati due vettori che contengono codici identificativi di clienti, dovremo cercare all’interno del codice cliente CB i valori del codice cliente Deact:


pos <- match(Deact$Codice.cliente, CB$Codice.cliente) [/code]

Come risultato otterremo i valori 2, 8, 4, e 3, che sono gli indici di riga che nella tabella CB identificano i clienti presenti nella tabella Deact.

Il nostro scopo finale è quello di aggiungere al dataset Deact una nuova colonna che indica l’agente di riferimento di ogni cliente. Per fare questo possiamo utilizzare il nuovo vettore pos, estrapolando dalla colonna Agente del dataset CB esclusivamente le informazioni su quei clienti che sono anche contenuti in Deact:


Deact$Agente <- CB$Agente[pos] [/code]

La procedura quindi sfrutta una colonna, comune a entrambi i dataset, che funziona da chiave di ricerca: utilizzando la funzione match si individuano gli indici di posizione su un dataset e, grazie a questi, si estrapolano solo i dati necessari e nell’ordine corretto per essere direttamente aggiunti nell’altro dataset.

Print Friendly

3 Commenti per “Incrociare due tabelle di dati

  1. Alberto Giannetti

    Io utilizzo il comando merge che di per sè è più lungo. Se debbo matchare due datasets tramite una variabile in comune ad esempio i datasets A e B per la variabile comune ID_PAZIENTE faccio così:

    C<-merge(A, B, by.x="ID_PAZIENTE", by.y="ID_PAZIENTE")
    il comando all.x=T o all.Y=T li utilizzo nel caso in cui debbo matchare i 2 dataset e lasciare tutte le variabili del primo o del secondo

Lascia un Commento