Manipulation avec dplyr#
le package dplyr#
Dans ce cours, afin de manipuler les données, nous allons utiliser la librairie dplyr
qui assure une manipulation plus intuitive des données. Toutefois, vous pouvez utiliser tout autre libraire ou même les fonctions de base de R
.
# install.packages("dplyr")
D’abord, téléchargeons un petit df afin d’illustrer la théorie. Dans ce df, nous avons les données d’un cycliste qui est sorti un jour d’été faire un petit tour dans l’île de Montréal. Chaque observation, représente le nombre de km parcourus d’un parcours (lap), le temps que ça a pris, la vitesse moyenne en km/h
de chaque lap, la puissance moyenne en watts
et finalement, les battements de cours par minutes.
df<-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_2.txt")
df
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
<dbl> | <chr> | <dbl> | <int> | <int> |
1.24 | 4:01 | 19.1 | 160 | 134 |
4.84 | 9:42 | 30.2 | 133 | 146 |
1.02 | 1:57 | 30.8 | 141 | 139 |
17.61 | 36:11 | 29.2 | 125 | 144 |
9.27 | 19:10 | 29.0 | 121 | 143 |
Il possible d’ordonner les données avec la fonction de base de R
appelé order
. Par exemple, on voudrait ordonner notre df en ordre croissant sur la variable puissanceMoyenne
df[order(df$puissanceMoyenne),]
km | temps | vitesseMoyenne | puissanceMoyenne | bpm | |
---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <int> | <int> | |
5 | 9.27 | 19:10 | 29.0 | 121 | 143 |
4 | 17.61 | 36:11 | 29.2 | 125 | 144 |
2 | 4.84 | 9:42 | 30.2 | 133 | 146 |
3 | 1.02 | 1:57 | 30.8 | 141 | 139 |
1 | 1.24 | 4:01 | 19.1 | 160 | 134 |
Par défaut, l’ordre est est croissant, on peut le rendre décroissant en ajoutant l’argument decreasing = T
df[order(df$vitesseMoyenne, decreasing = T),]
km | temps | vitesseMoyenne | puissanceMoyenne | bpm | |
---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <int> | <int> | |
3 | 1.02 | 1:57 | 30.8 | 141 | 139 |
2 | 4.84 | 9:42 | 30.2 | 133 | 146 |
4 | 17.61 | 36:11 | 29.2 | 125 | 144 |
5 | 9.27 | 19:10 | 29.0 | 121 | 143 |
1 | 1.24 | 4:01 | 19.1 | 160 | 134 |
Toutefois, lorsque nous avons une base de données comportant un nombre plus important de variables, la syntaxe peut devenir plus compliquée et lourde d’écriture. Regardons un autre exemple:
df_ass <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/assurance.csv", header = T)
head(df_ass)
numeropol | debut_pol | fin_pol | freq_paiement | langue | type_prof | alimentation | type_territoire | utilisation | presence_alarme | ⋯ | cheveux | cout1 | cout2 | cout3 | cout4 | cout5 | cout6 | cout7 | nbsin | equipe | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <chr> | <chr> | <int> | <chr> | <chr> | <chr> | <chr> | <chr> | <int> | ⋯ | <chr> | <dbl> | <dbl> | <lgl> | <lgl> | <lgl> | <lgl> | <lgl> | <int> | <int> | |
1 | 4 | 11-4-1996 | 10-4-1997 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2 | 4 | 11-4-1997 | 10-4-1998 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
3 | 4 | 11-4-2002 | 17-7-2002 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
4 | 4 | 18-7-2002 | 10-4-2003 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
5 | 4 | 11-4-2003 | 10-4-2004 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
6 | 12 | 3-5-1995 | 2-5-1996 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
Affichons notre base de données en ordre croissant sur le nombre de sinistres et le numéro de police;
df_ass[order(df_ass$nbsin, df_ass$numeropol, decreasing = T),]
numeropol | debut_pol | fin_pol | freq_paiement | langue | type_prof | alimentation | type_territoire | utilisation | presence_alarme | ⋯ | cheveux | cout1 | cout2 | cout3 | cout4 | cout5 | cout6 | cout7 | nbsin | equipe | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <chr> | <chr> | <int> | <chr> | <chr> | <chr> | <chr> | <chr> | <int> | ⋯ | <chr> | <dbl> | <dbl> | <lgl> | <lgl> | <lgl> | <lgl> | <lgl> | <int> | <int> | |
988 | 2006 | 13-6-1996 | 12-6-1997 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 3.160124e+02 | 40.31056 | NA | NA | NA | NA | NA | 2 | 3 |
902 | 1820 | 1-10-1996 | 30-9-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | 1.465031e+02 | 780.73913 | NA | NA | NA | NA | NA | 2 | 3 |
861 | 1733 | 10-5-1998 | 9-5-1999 | 1 | F | Infirmière | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 7.611553e+02 | 173.15528 | NA | NA | NA | NA | NA | 2 | 3 |
672 | 1138 | 3-10-2002 | 27-3-2003 | 12 | F | Infirmière | Carnivore | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | 1.745925e+03 | 1000.81367 | NA | NA | NA | NA | NA | 2 | 3 |
470 | 692 | 18-6-2001 | 17-6-2002 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Blonds | 6.760745e+02 | 239.21118 | NA | NA | NA | NA | NA | 2 | 3 |
451 | 661 | 19-5-1998 | 18-5-1999 | 12 | F | Autre | Carnivore | Rural | Loisir | 0 | ⋯ | Bruns | 1.068516e+03 | 127.31677 | NA | NA | NA | NA | NA | 2 | 3 |
414 | 612 | 17-3-1996 | 10-2-1997 | 12 | F | Technicien | Carnivore | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 4.152733e+02 | 10586.13043 | NA | NA | NA | NA | NA | 2 | 3 |
416 | 612 | 3-4-1997 | 10-2-1998 | 12 | F | Technicien | Carnivore | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 4.191863e+02 | 866.93168 | NA | NA | NA | NA | NA | 2 | 3 |
387 | 579 | 29-6-1995 | 28-6-1996 | 12 | F | Avocat | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | 2.647826e+02 | 2105.92547 | NA | NA | NA | NA | NA | 2 | 3 |
388 | 579 | 29-6-1996 | 28-6-1997 | 12 | F | Avocat | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 6.344658e+02 | 510.38509 | NA | NA | NA | NA | NA | 2 | 3 |
289 | 387 | 14-5-1998 | 22-2-1999 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 6.465839e+00 | 331.08696 | NA | NA | NA | NA | NA | 2 | 3 |
263 | 373 | 5-4-1998 | 4-4-1999 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 5.057329e+02 | 1776.34783 | NA | NA | NA | NA | NA | 2 | 3 |
235 | 299 | 21-3-1998 | 30-11-1998 | 12 | F | Actuaire | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 2.170062e+02 | 57.75155 | NA | NA | NA | NA | NA | 2 | 3 |
132 | 140 | 15-4-1995 | 14-4-1996 | 12 | F | Médecin | Végétalien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 4.666087e+02 | 469.65839 | NA | NA | NA | NA | NA | 2 | 3 |
118 | 116 | 4-9-1998 | 11-6-1999 | 1 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 3.167205e+02 | 1803.69565 | NA | NA | NA | NA | NA | 2 | 3 |
66 | 79 | 20-11-1997 | 21-6-1998 | 12 | F | Ingénieur | Végétalien | Rural | Travail-quotidien | 0 | ⋯ | Bruns | 1.201242e+01 | 927.62733 | NA | NA | NA | NA | NA | 2 | 3 |
52 | 71 | 15-2-1996 | 14-2-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | 2.227901e+03 | 2001.62733 | NA | NA | NA | NA | NA | 2 | 3 |
1001 | 2036 | 14-3-2001 | 13-3-2002 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 2.310518e+05 | NA | NA | NA | NA | NA | NA | 1 | 3 |
992 | 2022 | 30-10-1995 | 20-11-1995 | 12 | F | Infirmière | Végétalien | Urbain | Travail-quotidien | 1 | ⋯ | Bruns | 4.865839e+01 | NA | NA | NA | NA | NA | NA | 1 | 3 |
989 | 2006 | 13-6-1998 | 12-6-1999 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | 9.957019e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
991 | 2006 | 13-9-2000 | 12-6-2001 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 8.286087e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
964 | 1966 | 7-7-1995 | 22-5-1996 | 12 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 7.399578e+03 | NA | NA | NA | NA | NA | NA | 1 | 3 |
972 | 1966 | 13-7-2000 | 1-4-2001 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 1.721677e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
973 | 1966 | 2-4-2001 | 6-7-2001 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 4.098696e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
955 | 1941 | 6-6-1997 | 5-6-1998 | 12 | F | Actuaire | Carnivore | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 6.278944e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
949 | 1920 | 17-5-1999 | 16-5-2000 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 4.354161e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
940 | 1915 | 5-8-1999 | 4-8-2000 | 1 | F | Infirmière | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 5.925901e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
920 | 1869 | 1-10-1995 | 4-5-1996 | 1 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 2.256770e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
921 | 1869 | 5-5-1996 | 4-5-1997 | 1 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 7.903975e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
924 | 1869 | 5-5-1999 | 4-5-2000 | 1 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Blonds | 2.036584e+02 | NA | NA | NA | NA | NA | NA | 1 | 3 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
33 | 23 | 13-12-1996 | 31-1-1997 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
34 | 23 | 1-2-1997 | 31-1-1998 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
35 | 23 | 1-2-1998 | 31-1-1999 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
21 | 15 | 6-1-1998 | 21-8-1998 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
22 | 15 | 22-8-1998 | 5-1-1999 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
24 | 15 | 6-1-2000 | 16-4-2000 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
25 | 15 | 17-4-2000 | 5-1-2001 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
27 | 15 | 6-1-2002 | 6-8-2002 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
28 | 15 | 7-8-2002 | 1-12-2002 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
29 | 15 | 2-12-2002 | 5-1-2003 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
30 | 15 | 6-1-2003 | 5-1-2004 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
16 | 14 | 29-10-1997 | 3-11-1997 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
17 | 14 | 4-11-1997 | 28-10-1998 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
18 | 14 | 29-10-1998 | 12-3-1999 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
19 | 14 | 13-3-1999 | 28-10-1999 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
6 | 12 | 3-5-1995 | 2-5-1996 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
7 | 12 | 3-5-1996 | 2-5-1997 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
8 | 12 | 3-5-1997 | 2-5-1998 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
9 | 12 | 3-5-1998 | 2-5-1999 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
10 | 12 | 3-5-1999 | 2-5-2000 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
11 | 12 | 3-5-2000 | 2-5-2001 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
12 | 12 | 3-5-2001 | 30-5-2001 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
13 | 12 | 31-5-2001 | 2-5-2002 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
14 | 12 | 3-5-2002 | 12-12-2002 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
15 | 12 | 13-12-2002 | 2-5-2003 | 1 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1 | 4 | 11-4-1996 | 10-4-1997 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2 | 4 | 11-4-1997 | 10-4-1998 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
3 | 4 | 11-4-2002 | 17-7-2002 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
4 | 4 | 18-7-2002 | 10-4-2003 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
5 | 4 | 11-4-2003 | 10-4-2004 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
Dans le tableau affiché ci-haut, on voit bien que cette fonction ne nous permet pas d’appliquer un ordre croissant ou décroissant sur une variable précise
arrange#
Maintenant, utilisons le paquet (package) dplyr
qui nous permet de plus facilement d’appliquer un ordre quelconque sur une variable précise indépendamment des autres variables;
library(dplyr, warn.conflicts = FALSE)
arrange(df_ass, desc(nbsin), numeropol)
numeropol | debut_pol | fin_pol | freq_paiement | langue | type_prof | alimentation | type_territoire | utilisation | presence_alarme | ⋯ | cheveux | cout1 | cout2 | cout3 | cout4 | cout5 | cout6 | cout7 | nbsin | equipe |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <chr> | <chr> | <int> | <chr> | <chr> | <chr> | <chr> | <chr> | <int> | ⋯ | <chr> | <dbl> | <dbl> | <lgl> | <lgl> | <lgl> | <lgl> | <lgl> | <int> | <int> |
71 | 15-2-1996 | 14-2-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | 2227.900621 | 2001.62733 | NA | NA | NA | NA | NA | 2 | 3 |
79 | 20-11-1997 | 21-6-1998 | 12 | F | Ingénieur | Végétalien | Rural | Travail-quotidien | 0 | ⋯ | Bruns | 12.012422 | 927.62733 | NA | NA | NA | NA | NA | 2 | 3 |
116 | 4-9-1998 | 11-6-1999 | 1 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 316.720497 | 1803.69565 | NA | NA | NA | NA | NA | 2 | 3 |
140 | 15-4-1995 | 14-4-1996 | 12 | F | Médecin | Végétalien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 466.608696 | 469.65839 | NA | NA | NA | NA | NA | 2 | 3 |
299 | 21-3-1998 | 30-11-1998 | 12 | F | Actuaire | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 217.006211 | 57.75155 | NA | NA | NA | NA | NA | 2 | 3 |
373 | 5-4-1998 | 4-4-1999 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 505.732919 | 1776.34783 | NA | NA | NA | NA | NA | 2 | 3 |
387 | 14-5-1998 | 22-2-1999 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 6.465839 | 331.08696 | NA | NA | NA | NA | NA | 2 | 3 |
579 | 29-6-1995 | 28-6-1996 | 12 | F | Avocat | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | 264.782609 | 2105.92547 | NA | NA | NA | NA | NA | 2 | 3 |
579 | 29-6-1996 | 28-6-1997 | 12 | F | Avocat | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 634.465839 | 510.38509 | NA | NA | NA | NA | NA | 2 | 3 |
612 | 17-3-1996 | 10-2-1997 | 12 | F | Technicien | Carnivore | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 415.273292 | 10586.13043 | NA | NA | NA | NA | NA | 2 | 3 |
612 | 3-4-1997 | 10-2-1998 | 12 | F | Technicien | Carnivore | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 419.186335 | 866.93168 | NA | NA | NA | NA | NA | 2 | 3 |
661 | 19-5-1998 | 18-5-1999 | 12 | F | Autre | Carnivore | Rural | Loisir | 0 | ⋯ | Bruns | 1068.515528 | 127.31677 | NA | NA | NA | NA | NA | 2 | 3 |
692 | 18-6-2001 | 17-6-2002 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Blonds | 676.074534 | 239.21118 | NA | NA | NA | NA | NA | 2 | 3 |
1138 | 3-10-2002 | 27-3-2003 | 12 | F | Infirmière | Carnivore | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | 1745.925466 | 1000.81367 | NA | NA | NA | NA | NA | 2 | 3 |
1733 | 10-5-1998 | 9-5-1999 | 1 | F | Infirmière | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 761.155280 | 173.15528 | NA | NA | NA | NA | NA | 2 | 3 |
1820 | 1-10-1996 | 30-9-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | 146.503106 | 780.73913 | NA | NA | NA | NA | NA | 2 | 3 |
2006 | 13-6-1996 | 12-6-1997 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 316.012422 | 40.31056 | NA | NA | NA | NA | NA | 2 | 3 |
15 | 26-6-1996 | 5-1-1997 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 413.428571 | NA | NA | NA | NA | NA | NA | 1 | 3 |
15 | 6-1-1999 | 5-1-2000 | 12 | F | Technicien | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 192.093168 | NA | NA | NA | NA | NA | NA | 1 | 3 |
15 | 6-1-2001 | 5-1-2002 | 12 | F | Technicien | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Blonds | 1590.652174 | NA | NA | NA | NA | NA | NA | 1 | 3 |
62 | 23-9-1998 | 22-9-1999 | 1 | F | Infirmière | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | 1339.484472 | NA | NA | NA | NA | NA | NA | 1 | 3 |
71 | 24-3-1995 | 30-5-1995 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | 603.720497 | NA | NA | NA | NA | NA | NA | 1 | 3 |
71 | 31-5-1995 | 3-8-1995 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Blonds | 4127.689441 | NA | NA | NA | NA | NA | NA | 1 | 3 |
71 | 15-2-1998 | 27-5-1998 | 1 | F | Médecin | Végétarien | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | 345.590062 | NA | NA | NA | NA | NA | NA | 1 | 3 |
75 | 31-7-1996 | 14-8-1996 | 12 | F | Hockeyeur | Végétarien | Rural | Travail-occasionnel | 0 | ⋯ | Bruns | 473.279503 | NA | NA | NA | NA | NA | NA | 1 | 3 |
81 | 30-5-2001 | 31-1-2002 | 12 | F | Technicien | Carnivore | Rural | Travail-quotidien | 0 | ⋯ | Bruns | 2518.968944 | NA | NA | NA | NA | NA | NA | 1 | 3 |
81 | 30-5-2002 | 29-5-2003 | 12 | F | Technicien | Carnivore | Rural | Travail-quotidien | 0 | ⋯ | Bruns | 423.881988 | NA | NA | NA | NA | NA | NA | 1 | 3 |
82 | 9-5-1997 | 8-5-1998 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | 2955.093168 | NA | NA | NA | NA | NA | NA | 1 | 3 |
85 | 3-1-2002 | 2-1-2003 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 1064.801242 | NA | NA | NA | NA | NA | NA | 1 | 3 |
97 | 8-12-2000 | 24-5-2001 | 12 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 1821.583851 | NA | NA | NA | NA | NA | NA | 1 | 3 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
1966 | 23-5-1996 | 6-7-1996 | 12 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-1996 | 6-7-1997 | 12 | F | Infirmière | Carnivore | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-1997 | 6-7-1998 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-1998 | 6-7-1999 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-1999 | 10-8-1999 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 11-8-1999 | 6-7-2000 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-2000 | 12-7-2000 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-2001 | 6-7-2002 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1966 | 7-7-2002 | 6-7-2003 | 12 | F | Infirmière | Végétarien | Urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1989 | 15-11-1995 | 14-11-1996 | 12 | F | Infirmière | Végétalien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1989 | 15-11-1996 | 26-6-1997 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1989 | 27-6-1997 | 26-8-1997 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1989 | 27-8-1997 | 14-11-1997 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1989 | 28-11-1997 | 27-1-1998 | 12 | F | Infirmière | Végétarien | Rural | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1993 | 31-12-1995 | 30-12-1996 | 12 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1993 | 31-12-1996 | 30-12-1997 | 12 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1993 | 31-12-1997 | 30-12-1998 | 12 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
1993 | 31-12-1998 | 22-12-1999 | 12 | F | Ingénieur | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2006 | 13-6-1995 | 31-12-1995 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2006 | 1-1-1996 | 22-2-1996 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2006 | 23-2-1996 | 12-6-1996 | 12 | F | Technicien | Carnivore | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Blonds | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2006 | 13-6-2000 | 12-9-2000 | 12 | F | Technicien | Végétarien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2035 | 25-2-1996 | 29-5-1996 | 12 | F | Hockeyeur | Végétarien | Rural | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2035 | 30-5-1996 | 24-2-1997 | 12 | F | Hockeyeur | Végétarien | Rural | Travail-quotidien | 1 | ⋯ | Roux | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2035 | 25-2-1997 | 24-2-1998 | 12 | F | Hockeyeur | Végétarien | Rural | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2035 | 25-2-1998 | 24-2-1999 | 12 | F | Hockeyeur | Végétarien | Rural | Travail-quotidien | 1 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2036 | 5-5-1998 | 13-3-1999 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2036 | 7-4-1999 | 13-3-2000 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2036 | 14-3-2000 | 26-2-2001 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
2036 | 27-2-2001 | 13-3-2001 | 12 | F | Médecin | Carnivore | Semi-urbain | Travail-occasionnel | 0 | ⋯ | Bruns | NA | NA | NA | NA | NA | NA | NA | 0 | 3 |
select#
Ce paquet nous permet aussi de sélectionner des variables d’intérêt. Par exemple, dans notre df_ass
, on désire seulement sélectionner les variables numeropol
, type_territoire
et nbsin
select(df_ass, numeropol,type_territoire, nbsin)
numeropol | type_territoire | nbsin |
---|---|---|
<int> | <chr> | <int> |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
14 | Rural | 0 |
14 | Rural | 0 |
14 | Rural | 0 |
14 | Rural | 0 |
15 | Semi-urbain | 1 |
15 | Semi-urbain | 0 |
15 | Urbain | 0 |
15 | Urbain | 1 |
15 | Urbain | 0 |
15 | Urbain | 0 |
15 | Urbain | 1 |
15 | Urbain | 0 |
15 | Urbain | 0 |
15 | Urbain | 0 |
15 | Urbain | 0 |
⋮ | ⋮ | ⋮ |
1966 | Urbain | 1 |
1966 | Urbain | 1 |
1966 | Urbain | 0 |
1966 | Urbain | 0 |
1989 | Rural | 0 |
1989 | Rural | 0 |
1989 | Rural | 0 |
1989 | Rural | 0 |
1989 | Rural | 0 |
1993 | Semi-urbain | 0 |
1993 | Semi-urbain | 0 |
1993 | Semi-urbain | 0 |
1993 | Semi-urbain | 0 |
2006 | Semi-urbain | 0 |
2006 | Semi-urbain | 0 |
2006 | Semi-urbain | 0 |
2006 | Semi-urbain | 2 |
2006 | Semi-urbain | 1 |
2006 | Semi-urbain | 0 |
2006 | Semi-urbain | 1 |
2022 | Urbain | 1 |
2035 | Rural | 0 |
2035 | Rural | 0 |
2035 | Rural | 0 |
2035 | Rural | 0 |
2036 | Semi-urbain | 0 |
2036 | Semi-urbain | 0 |
2036 | Semi-urbain | 0 |
2036 | Semi-urbain | 0 |
2036 | Semi-urbain | 1 |
filter#
Afin de filtrer des données sur des observations d’intérêt. On peut utiliser la fonction de base de R which
. Par exemple dans les données Cars93
du package MASS
, on voudrait extraire les véhicules ayant 8 cylindres. On voudrait également afficher que les deux variables 'Horsepower'
et 'Passengers'
library(MASS, warn.conflicts = F)
Cars93[which(Cars93$Cylinders==8), c('Horsepower' , 'Passengers')]
Horsepower | Passengers | |
---|---|---|
<int> | <int> | |
10 | 200 | 6 |
11 | 295 | 5 |
18 | 170 | 6 |
19 | 300 | 2 |
38 | 190 | 6 |
48 | 278 | 5 |
52 | 210 | 6 |
Toutefois, la fonction filter
de la librairie dyplr
est plus flexible lorsqu’il s’agit d’appliquer des filtres plus complexes. Essayons le même exemple avec cette fonction;
filter(Cars93, Cylinders==8)[c('Horsepower' , 'Passengers')]
Horsepower | Passengers |
---|---|
<int> | <int> |
200 | 6 |
295 | 5 |
170 | 6 |
300 | 2 |
190 | 6 |
278 | 5 |
210 | 6 |
Si l’on cherche les médecins qui ont eu deux sinistres dans notre base de données df_ass
;
filter(df_ass, nbsin==2, type_prof=="Médecin")
numeropol | debut_pol | fin_pol | freq_paiement | langue | type_prof | alimentation | type_territoire | utilisation | presence_alarme | ⋯ | cheveux | cout1 | cout2 | cout3 | cout4 | cout5 | cout6 | cout7 | nbsin | equipe |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <chr> | <chr> | <int> | <chr> | <chr> | <chr> | <chr> | <chr> | <int> | ⋯ | <chr> | <dbl> | <dbl> | <lgl> | <lgl> | <lgl> | <lgl> | <lgl> | <int> | <int> |
71 | 15-2-1996 | 14-2-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 0 | ⋯ | Bruns | 2227.9006 | 2001.6273 | NA | NA | NA | NA | NA | 2 | 3 |
140 | 15-4-1995 | 14-4-1996 | 12 | F | Médecin | Végétalien | Semi-urbain | Travail-occasionnel | 1 | ⋯ | Bruns | 466.6087 | 469.6584 | NA | NA | NA | NA | NA | 2 | 3 |
1820 | 1-10-1996 | 30-9-1997 | 1 | F | Médecin | Carnivore | Semi-urbain | Travail-quotidien | 1 | ⋯ | Bruns | 146.5031 | 780.7391 | NA | NA | NA | NA | NA | 2 | 3 |
mutate#
Dans ce package, on trouve aussi la fonction mutate
qui permet d’ajouter de nouvelles variables à notre df
mutate(df, arrondi=round(df$vitesseMoyenne,0))
km | temps | vitesseMoyenne | puissanceMoyenne | bpm | arrondi |
---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <int> | <int> | <dbl> |
1.24 | 4:01 | 19.1 | 160 | 134 | 19 |
4.84 | 9:42 | 30.2 | 133 | 146 | 30 |
1.02 | 1:57 | 30.8 | 141 | 139 | 31 |
17.61 | 36:11 | 29.2 | 125 | 144 | 29 |
9.27 | 19:10 | 29.0 | 121 | 143 | 29 |
Ajoutons maintenant trois nouvlles variables;
mutate(df, arrondi=round(df$vitesseMoyenne,0), segementStrava=paste("segment",1:5,sep = "_"), arrondi_2=arrondi/2)
km | temps | vitesseMoyenne | puissanceMoyenne | bpm | arrondi | segementStrava | arrondi_2 |
---|---|---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <int> | <int> | <dbl> | <chr> | <dbl> |
1.24 | 4:01 | 19.1 | 160 | 134 | 19 | segment_1 | 9.5 |
4.84 | 9:42 | 30.2 | 133 | 146 | 30 | segment_2 | 15.0 |
1.02 | 1:57 | 30.8 | 141 | 139 | 31 | segment_3 | 15.5 |
17.61 | 36:11 | 29.2 | 125 | 144 | 29 | segment_4 | 14.5 |
9.27 | 19:10 | 29.0 | 121 | 143 | 29 | segment_5 | 14.5 |
summarize#
La fonction summarize
est très similaire à la fonction mutate
. Toutefois, contrairement à mutate
, la fonction summarize
ne travaille pas sur une copie du df, mais elle crée un tout nouveau df avec les nouvelles variables.
summarise(df,TotalKmParcour=sum(km))
TotalKmParcour |
---|
<dbl> |
33.98 |
summarise(df,TotalKmParcour=sum(km), vitesseMoyenne= mean(df$vitesseMoyenne), puissanceMoyenne=mean(df$puissanceMoyenne))
TotalKmParcour | vitesseMoyenne | puissanceMoyenne |
---|---|---|
<dbl> | <dbl> | <dbl> |
33.98 | 27.66 | 136 |
On voit bien que l’écriture du code commence à être un peu plus compliquée lorsque nous avons plusieurs parenthèses dans notre fonction. Pour remédier à ce problème, nous verrons la notion de piiping;
L’opérateur Pipe: %>%#
Avant d’aller plus loin, introduisons l’opérateur de pipe:%>%. dplyr importe cet opérateur d’une autre librairie (magrittr
). Cet opérateur vous permet de diriger la sortie d’une fonction vers l’entrée d’une autre fonction. Au lieu d’imbriquer des fonctions (lecture de l’intérieur vers l’extérieur), l’idée de piping est de lire les fonctions de gauche à droite.
Crédit de l’image Pipes in R Tutorial For Beginners
Lorsque nous avons écrit:
select(df_ass, numeropol, type_territoire, nbsin)
Error in select(df_ass, numeropol, type_territoire, nbsin): unused arguments (numeropol, type_territoire, nbsin)
Traceback:
Si on lit ce que nous avons écrit précédemment de l’intérieur vert l’extérieur, en utilisant le piping, nous aurons ceci:
df_ass %>%
select (numeropol,type_territoire, nbsin)
numeropol | type_territoire | nbsin |
---|---|---|
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
⋮ | ⋮ | ⋮ |
2036 | Semi-urbain | 0 |
2036 | Semi-urbain | 1 |
ou;
df_ass %>%
select (numeropol,type_territoire, nbsin) %>%
head
numeropol | type_territoire | nbsin |
---|---|---|
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
4 | Semi-urbain | 0 |
⋮ | ⋮ | ⋮ |
4 | Semi-urbain | 0 |
12 | Semi-urbain | 0 |
group_by#
Nous pouvons aussi grouper les données comme nous le faisions dans SAS
avec les PROC SQL
df_ass$coutTot<-rowSums(df_ass[,c(19:25)], na.rm = T, dims = 1)
df_ass
numeropol | debut_pol | fin_pol | freq_paiement | ⋯ | cout7 | nbsin | equipe | coutTot |
---|---|---|---|---|---|---|---|---|
4 | 11-4-1996 | 10-4-1997 | 12 | ⋯ | NA | 0 | 3 | 0 |
4 | 11-4-1997 | 10-4-1998 | 12 | ⋯ | NA | 0 | 3 | 0 |
4 | 11-4-2002 | 17-7-2002 | 12 | ⋯ | NA | 0 | 3 | 0 |
⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ |
2036 | 27-2-2001 | 13-3-2001 | 12 | ⋯ | NA | 0 | 3 | 0.0 |
2036 | 14-3-2001 | 13-3-2002 | 12 | ⋯ | NA | 1 | 3 | 231051.8 |
summarise(df_ass,TotalNbSin=sum(nbsin), TotCout= sum((coutTot), na.rm = T))
TotalNbSin | TotCout |
---|---|
156 | 1078791 |
Cherchons par exemple nombre de sinistres totaux ainsi que leurs coûts par territoire. En utilisant la syntaxe du piping, ça devient plus facile d’inclure plus de sous-groupes;
df_ass %>%
group_by(type_territoire) %>%
summarise(TotalNbSin=sum(nbsin),
TotCout= sum((coutTot), na.rm = T)
)
type_territoire | TotalNbSin | TotCout |
---|---|---|
Rural | 51 | 547105.01 |
Semi-urbain | 80 | 471157.64 |
Urbain | 25 | 60528.81 |
Jointure des bases des données#
Dans cette section, nous allons joindre deux ou plusieurs df. Mais d’abord importons deux df afin illustrer quelques exemples;
df_demo <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/donnes_demo.csv", header = T)
df_demo
name | province | company | langue | date_naissance | agee | age_permis | numeropol |
---|---|---|---|---|---|---|---|
Shane Robinson | Nova Scotia | May Ltd | fr | 1944-10-20 | 72 | 24 | 1 |
Courtney Nguyen | Saskatchewan | Foley, Moore and Mitchell | en | 1985-12-09 | 31 | 24 | 5 |
Lori Washington | Yukon Territory | Robinson-Reyes | fr | 1970-01-27 | 47 | 28 | 13 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
Heidi Freeman | Northwest Territories | Singh, Esparza and Santos | en | 1951-06-07 | 65 | 18 | 84 |
Morgan Buchanan | Northwest Territories | Rollins Inc | fr | 1971-07-31 | 45 | 31 | 91 |
df_auto <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/cars_info.csv", header = T)
df_auto
numeropol | marque_voiture | couleur_voiture | presence_alarme | license_plate |
---|---|---|---|---|
1 | Autres | Autre | 0 | DW 3168 |
5 | RENAULT | Autre | 0 | 926 1RL |
13 | RENAULT | Autre | 1 | SOV 828 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
84 | HONDA | Autre | 0 | CBV 102 |
91 | BMW | Autre | 1 | UOR-0725 |
Dans ces deux df, nous avons une colonne en commun numeropol
df_demo$numeropol
- 1
- 5
- 13
- 16
- 22
- 28
- 29
- 49
- 53
- 57
- 59
- 65
- 67
- 68
- 69
- 72
- 78
- 83
- 84
- 91
df_auto$numeropol
- 1
- 5
- 13
- 16
- 22
- 22
- 28
- 29
- 49
- 53
- 53
- 57
- 59
- 65
- 65
- 67
- 68
- 69
- 69
- 72
- 78
- 83
- 84
- 84
- 91
On peut voir l’index des lignes qui se trouvent dans les deux df
match(df_demo$numeropol, df_auto$numeropol)
- 1
- 2
- 3
- 4
- 5
- 7
- 8
- 9
- 10
- 12
- 13
- 14
- 16
- 17
- 18
- 20
- 21
- 22
- 23
- 25
df_demo$numeropol[match(df_demo$numeropol, df_auto$numeropol)]
- 1
- 5
- 13
- 16
- 22
- 29
- 49
- 53
- 57
- 65
- 67
- 68
- 72
- 78
- 83
- 91
- <NA>
- <NA>
- <NA>
- <NA>
On peut aussi faire un test logique sur la présence des observations du df_demo dans df_auto;
df_demo$numeropol %in% df_auto$numeropol
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
ou le contraire maintenant
df_auto$numeropol %in% df_demo$numeropol
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
- TRUE
Dans ce cas toutes les variables se trouvent dans les deux df
merge(df_demo,df_auto, by.x = "numeropol", by.y = "numeropol") # x est le df_demo et y est le df df_auto
numeropol | name | province | company | ⋯ | marque_voiture | couleur_voiture | presence_alarme | license_plate |
---|---|---|---|---|---|---|---|---|
1 | Shane Robinson | Nova Scotia | May Ltd | ⋯ | Autres | Autre | 0 | DW 3168 |
5 | Courtney Nguyen | Saskatchewan | Foley, Moore and Mitchell | ⋯ | RENAULT | Autre | 0 | 926 1RL |
13 | Lori Washington | Yukon Territory | Robinson-Reyes | ⋯ | RENAULT | Autre | 1 | SOV 828 |
⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ |
84 | Heidi Freeman | Northwest Territories | Singh, Esparza and Santos | ⋯ | HONDA | Autre | 0 | CBV 102 |
91 | Morgan Buchanan | Northwest Territories | Rollins Inc | ⋯ | BMW | Autre | 1 | UOR-0725 |
Que serait-il arrivé si l’on n’avait pas spécifié les arguments by.x = "numeropol", by.y = "numeropol"
?
merge(df_demo,df_auto)
numeropol | name | province | company | ⋯ | marque_voiture | couleur_voiture | presence_alarme | license_plate |
---|---|---|---|---|---|---|---|---|
1 | Shane Robinson | Nova Scotia | May Ltd | ⋯ | Autres | Autre | 0 | DW 3168 |
5 | Courtney Nguyen | Saskatchewan | Foley, Moore and Mitchell | ⋯ | RENAULT | Autre | 0 | 926 1RL |
13 | Lori Washington | Yukon Territory | Robinson-Reyes | ⋯ | RENAULT | Autre | 1 | SOV 828 |
⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ |
84 | Heidi Freeman | Northwest Territories | Singh, Esparza and Santos | ⋯ | HONDA | Autre | 0 | CBV 102 |
91 | Morgan Buchanan | Northwest Territories | Rollins Inc | ⋯ | BMW | Autre | 1 | UOR-0725 |
Cela a bien fonctionné, car R a automatiquement trouvé les noms de colonnes communs au deux df;
Maintenant, changeons les noms de colonnes et voyons ce qui arrive
names(df_auto)[names(df_auto)=="numeropol"] <- "auto_numpol"
Bien évidemment, cela crée une jointure croisée comme on l’avait vu dans les cours de SAS
head(merge(df_demo,df_auto))
name | province | company | langue | ⋯ | marque_voiture | couleur_voiture | presence_alarme | license_plate |
---|---|---|---|---|---|---|---|---|
Shane Robinson | Nova Scotia | May Ltd | fr | ⋯ | Autres | Autre | 0 | DW 3168 |
Courtney Nguyen | Saskatchewan | Foley, Moore and Mitchell | en | ⋯ | Autres | Autre | 0 | DW 3168 |
Lori Washington | Yukon Territory | Robinson-Reyes | fr | ⋯ | Autres | Autre | 0 | DW 3168 |
⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ |
Jeffrey Garcia | Nunavut | Berger-Thompson | en | ⋯ | Autres | Autre | 0 | DW 3168 |
Colleen Coleman | Saskatchewan | Simmons-Smith | en | ⋯ | Autres | Autre | 0 | DW 3168 |
On vient bien que dans la dernière colonne license_plate
, nous obtenons la même observation ce qui est clairement une erreur;
Corrigeons le problème;
head(merge(df_demo,df_auto, by.x = "numeropol", by.y = "auto_numpol"))
numeropol | name | province | company | ⋯ | marque_voiture | couleur_voiture | presence_alarme | license_plate |
---|---|---|---|---|---|---|---|---|
1 | Shane Robinson | Nova Scotia | May Ltd | ⋯ | Autres | Autre | 0 | DW 3168 |
5 | Courtney Nguyen | Saskatchewan | Foley, Moore and Mitchell | ⋯ | RENAULT | Autre | 0 | 926 1RL |
13 | Lori Washington | Yukon Territory | Robinson-Reyes | ⋯ | RENAULT | Autre | 1 | SOV 828 |
⋮ | ⋮ | ⋮ | ⋮ | ⋱ | ⋮ | ⋮ | ⋮ | ⋮ |
22 | Jeffrey Garcia | Nunavut | Berger-Thompson | ⋯ | VOLKSWAGEN | Autre | 1 | 453 CFM |
22 | Jeffrey Garcia | Nunavut | Berger-Thompson | ⋯ | VOLKSWAGEN | Autre | 0 | FHH 537 |
left_join#
la fonction left_join
prend toute l’information de gauche et l’information existante de la partie droite qui est basée sur le critère en commun
x<-data.frame(nom=c("Gabriel", "Adel", "NM", "Mathieu", "Amine", "Mohamed"),
bureaux=c("5518", "4538", "5518", "5517", "4538", "4540"))
x
nom | bureaux |
---|---|
Gabriel | 5518 |
Adel | 4538 |
NM | 5518 |
⋮ | ⋮ |
Amine | 4538 |
Mohamed | 4540 |
y<-data.frame(nom=c("Gabriel", "Adel", "JP", "Mathieu", "Amine"),
diplome=c("M.Sc", "Ph.D", "Ph.D", "Ph.D", "Ph.D"))
y
nom | diplome |
---|---|
Gabriel | M.Sc |
Adel | Ph.D |
JP | Ph.D |
Mathieu | Ph.D |
Amine | Ph.D |
left_join(x,y,by = "nom")
Warning message:
“Column `nom` joining factors with different levels, coercing to character vector”
nom | bureaux | diplome |
---|---|---|
Gabriel | 5518 | M.Sc |
Adel | 4538 | Ph.D |
NM | 5518 | NA |
⋮ | ⋮ | ⋮ |
Amine | 4538 | Ph.D |
Mohamed | 4540 | NA |
inner_join#
Cette fonction permet de retourner seulement les éléments en commun des deux df
inner_join(x,y,by = "nom")
Warning message:
“Column `nom` joining factors with different levels, coercing to character vector”
nom | bureaux | diplome |
---|---|---|
Gabriel | 5518 | M.Sc |
Adel | 4538 | Ph.D |
Mathieu | 5517 | Ph.D |
Amine | 4538 | Ph.D |
semi_join#
Cette fonction retourne seulement les éléments du premier df qui se retrouve dans le deuxième df, sans nous retourner les éléments de ce dernier
semi_join(x,y,by = "nom")
anti_join#
Cette fonction le contraire de la précédente
anti_join(x,y,by = "nom")