Dans le monde de la base de données relationnelle, l'une des opérations les plus importantes est celle d'une jointure, dans laquelle deux tables peuvent être combinées selon les valeurs d'une variable commune. Dans R, deux trames de données peuvent être combinées de manière similaire à l'aide de la fonction merge().
La forme la plus simple est la suivante:

  1. merge(x,y)
Source code
Cela fusionne les images x et y. Il suppose que les deux trames de données ont une ou plusieurs colonnes avec des noms en commun. Voici un exemple:

  1. > d1
  2. kids states
  3. 1 Jack CA
  4. 2 Jill MA
  5. 3 Jillian MA
  6. 4 John HI
  7. > d2
  8. ages kids
  9. 1 10 Jill
  10. 2 7 Lillian
  11. 3 12 Jack
  12. > d <- merge(d1,d2)
  13. > d
  14. kids states ages
  15. 1 Jack CA 12
  16. 2 Jill MA 10
Source code

Ici, les deux cadres de données ont en commun les enfants comme variables. R a trouvé les lignes dans lesquelles cette variable avait la même valeur d'enfants dans les deux cadres de données (ceux de Jack et Jill). Il a ensuite créé un cadre de données avec des lignes correspondantes et avec des colonnes issues de cadres de données (enfants, états et âges).
La fonction merge() a nommé les arguments by.x et by.y qui gèrent les cas dans lesquels les variables ont des informations similaires mais des noms différents dans les deux trames de données. Voici un exemple:

  1. > d3
  2. ages pals
  3. 1 12 Jack
  4. 2 10 Jill
  5. 3 7 Lillian
  6. > merge(d1,d3,by.x="kids",by.y="pals")
  7. kids states ages
  8. 1 Jack CA 12
  9. 2 Jill MA 10
Source code
Même si notre variable s'appelait les enfants dans un cadre de données et les pals dans l'autre, il était destiné à stocker la même information, et donc la fusion avait du sens.
Les correspondances en double apparaîtront pleinement dans le résultat, éventuellement de manière non souhaitable.

  1. > d1
  2. kids states
  3. 1 Jack CA
  4. 2 Jill MA
  5. 3 Jillian MA
  6. 4 John HI
  7. > d2a <- rbind(d2,list(15,"Jill"))
  8. > d2a
  9. ages kids
  10. 1 12 Jack
  11. 2 10 Jill
  12. 3 7 Lillian
  13. 4 15 Jill
  14. > merge(d1,d2a)
  15. kids states ages
  16. 1 Jack CA 12
  17. 2 Jill MA 10
  18. 3 Jill MA 15
Source code

Il y a deux Jills dans d2a. Il y a un Jill dans d1 qui vit à Massachu -setts et un autre Jill avec une résidence inconnue. Dans notre exemple précédent, merge (d1, d2), il n'y avait qu'un Jill, qui a été supposé être le même dans les deux cadres de données. Mais ici, dans la fusion de l'appel (d1, d2a), il se pourrait que l'un des Jills soit un résident du Massachusetts. Il ressort clairement de ce petit exemple que vous devez choisir les variables correspondantes avec beaucoup de soin.

 

 

Exemple étendu: une base de données sur les employés
Voici une adaptation de l'un de mes projets de consultation. Il s'agissait de savoir si les travailleurs âgés étaient aussi nombreux que les plus jeunes. J'ai eu des données sur plusieurs variables, telles que l'âge et les notes de rendement, que j'ai utilisées dans ma comparaison des employés plus âgés et plus jeunes. J'ai également eu des numéros d'identification des employés, ce qui était crucial pour pouvoir connecter les deux fichiers de données: DA et DB.
Le fichier DA avait cet en-tête:
  1. "EmpID","Perf 1","Perf 2","Perf 3","Job Title"
Source code
Ce sont les noms de l'ID de l'employé, trois notes de performance et le titre du poste. DB n'avait pas d'en-tête. Les variables ont de nouveau commencé avec l'ID, suite aux dates de début et de fin d'emploi.
Les deux fichiers étaient au format CSV. Une partie de ma phase de nettoyage des données consistait à vérifier que chaque enregistrement contenait le nombre approprié de champs. DA, par exemple, devrait avoir cinq champs par enregistrement. Voici le contrôle:
  1. > count.fields ("DA", sep = ",")
  2. [1] 5555555555555555555555555555555555
  3. 5 5 5 5
  4. ...
Source code
Ici, j'ai précisé que le dossier DA avait des champs séparés par des virgules. La fonction a ensuite signalé le nombre de champs dans chaque enregistrement du fichier, ce qui, heureusement, était de 5 s.
J'aurais pu utiliser all () pour vérifier cela, plutôt que de le vérifier visuellement, via cet appel:
  1. all(count.fields("DA",sep=",") >= 5)
Source code
Une valeur de retour de TRUE signifierait que tout va bien. Alternativement, j'aurais pu utiliser ce formulaire:
  1. table(count.fields("DA",sep=","))
Source code
Je voudrais alors compter le nombre d'enregistrements avec cinq champs, quatre champs, six champs, etc.
Après cette vérification, j'ai ensuite lu dans les fichiers en tant que données:
  1. da <- read.csv("DA",header=TRUE,stringsAsFactors=FALSE)
  2. db <- read.csv("DB",header=FALSE,stringsAsFactors=FALSE)
Source code
Je voulais vérifier les éventuelles erreurs d'orthographe dans les différents champs, alors j'ai exécuté le code suivant:
  1. for (col in 1:6)
Source code
Cela m'a donné une liste des valeurs distinctes dans chaque colonne afin que je puisse explorer visuellement les mauvaises orthographes.
J'avais besoin de fusionner les deux trames de données, correspondant à l'ID de l'employé, alors j'ai exécuté le code suivant:
  1. mrg <- merge(da,db,by.x=1,by.y=1)
Source code
J'ai précisé que la première colonne serait la variable de fusion dans les deux cas. (Comme on l'a remarqué plus tôt, j'aurais aussi pu utiliser les noms de champs plutôt que les chiffres ici.)