Interrogation de données

Nous allons voir ici comment réaliser les opérations classiques faites en SQL au moyen de fonctions R.

Fonction subset()

Cette fonction permet de réaliser au moins deux opérations classiques en `SQL :

  • Restriction : limitation aux lignes respectant un critère
  • Projection : limitation à certaines colonnes

Restriction

La fonction subset() prend en premier paramètre le data.frame sur lequel faire l’opération. Le deuxième paramètre à définir ici est celui pour la restriction (subset =). Voici comment se restreindre par exemple aux voitures (données mtcars) avec une consommation strictement inférieure à 15 (mpg < 15).

subset(mtcars, subset = mpg < 15)
                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4

Projection

Ici, c’est le paramètre pour la projection qu’il faut définir (select =). On peut lui passer un ou plusieurs noms de colonnes. On veut par exemple ne récupérer que la puissance (hp) et la cylindrée (disp).

subset(mtcars, select = c(hp, disp))
                     hp  disp
Mazda RX4           110 160.0
Mazda RX4 Wag       110 160.0
Datsun 710           93 108.0
Hornet 4 Drive      110 258.0
Hornet Sportabout   175 360.0
Valiant             105 225.0
Duster 360          245 360.0
Merc 240D            62 146.7
Merc 230             95 140.8
Merc 280            123 167.6
Merc 280C           123 167.6
Merc 450SE          180 275.8
Merc 450SL          180 275.8
Merc 450SLC         180 275.8
Cadillac Fleetwood  205 472.0
Lincoln Continental 215 460.0
Chrysler Imperial   230 440.0
Fiat 128             66  78.7
Honda Civic          52  75.7
Toyota Corolla       65  71.1
Toyota Corona        97 120.1
Dodge Challenger    150 318.0
AMC Javelin         150 304.0
Camaro Z28          245 350.0
Pontiac Firebird    175 400.0
Fiat X1-9            66  79.0
Porsche 914-2        91 120.3
Lotus Europa        113  95.1
Ford Pantera L      264 351.0
Ferrari Dino        175 145.0
Maserati Bora       335 301.0
Volvo 142E          109 121.0

Mais il est aussi possible d’exclure des colonnes dans le résultat. C’est-à-dire que plutôt de dire celles qu’on veut, on va indiquer celles dont on ne veut pas.

subset(mtcars, select = -c(hp, disp))
                     mpg cyl drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 4.11 2.780 18.60  1  1    4    2

Combinaison des deux

Bien évidemment, il est possible de combiner les deux paramètres pour réaliser une opération de restriction et une opération de projection dans la même commande. Nous récupérons ici la puissance (hp) et la cylindrée (disp) des voitures (données mtcars) avec une consommation strictement inférieure à 15 (mpg < 15).

subset(mtcars, subset = mpg < 15, select = c(hp, disp))
                     hp disp
Duster 360          245  360
Cadillac Fleetwood  205  472
Lincoln Continental 215  460
Chrysler Imperial   230  440
Camaro Z28          245  350

Fonction transform()

Cette fonction permet elle de créer de nouvelles variables, basées sur des calculs à partir d’autres variables. Elle renvoie le data.frame, passé en premier paramètre, complété des nouvelles variables. On calcule ici par exemple le rapport poids (wt) / puissance (hp). Et on calcule aussi la consommation en litres pour 100 km.

transform(mtcars, 
          rapport = round(1000 * wt / hp), 
          conso = round(236 / mpg, 2))

Ici, toute fonction existante applicable sur un vecteur est utilisable.

Fonction aggregate()

On va pouvoir réaliser ici tous les calculs d’agrégats possibles sur une table, avec ou sans regroupement. Le premier paramètre sera la formule (sous la forme ... ~ ...) permettant de déterminer sur quelles variables faire le calcul (à gauche du ~) et quelles variables utiliser pour le regroupement (à droite du ~). Le deuxième sera le jeu de données à utiliser. Et le troisième sera la fonction à appliquer.

# Calcul de la moyenne de mpg pour tous
aggregate(mpg ~ 1, mtcars, mean)
       mpg
1 20.09062
# Calcul de la moyenne de mpg et de hp pour tous
aggregate(cbind(mpg, hp) ~ 1, mtcars, mean)
       mpg       hp
1 20.09062 146.6875
# Calcul de la moyenne de toutes les variables pour tous
aggregate(. ~ 1, mtcars, mean)
       mpg    cyl     disp       hp     drat      wt     qsec     vs
1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375
       am   gear   carb
1 0.40625 3.6875 2.8125
# Calcul de la moyenne de mpg pour chaque modalité de am
aggregate(mpg ~ am, mtcars, mean)
  am      mpg
1  0 17.14737
2  1 24.39231
# Calcul de la moyenne de mpg en fonction de am et de cyl
aggregate(mpg ~ am + cyl, mtcars, mean)
  am cyl      mpg
1  0   4 22.90000
2  1   4 28.07500
3  0   6 19.12500
4  1   6 20.56667
5  0   8 15.05000
6  1   8 15.40000
# Calcul de la moyenne de mpg et de hp en fonction de am et de cyl
aggregate(cbind(mpg, hp) ~ am + cyl, mtcars, mean)
  am cyl      mpg        hp
1  0   4 22.90000  84.66667
2  1   4 28.07500  81.87500
3  0   6 19.12500 115.25000
4  1   6 20.56667 131.66667
5  0   8 15.05000 194.16667
6  1   8 15.40000 299.50000

Fonction merge()

Cette fonction permet elle de réaliser des jointures entre deux tables. Pour présenter le fonctionnement, nous allons créer une table avec le type de moteur selon le nombre de cylindres (cyl dans mtcars). Vous remarquerez que la valeur 4 n’est pas présente dans ce tableau, alors qu’elle l’est dans mtcars. Inversement, 12 est présent ici mais pas dans mtcars.

types = data.frame(
    cyl = c(6, 8, 12),
    type = c("moyen", "gros", "très gros")
)
types
  cyl      type
1   6     moyen
2   8      gros
3  12 très gros
unique(mtcars$cyl)
[1] 6 4 8

La focntion merge() prend, au minimum, deux paramètres que sont les deux tables à fusionner. Par défaut, c’est une jointure naturelle qui est réalisée (i.e. on recherche l’égalité des variables ayant le même nom).

merge(mtcars, types)
   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb  type
1    6 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4 moyen
2    6 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4 moyen
3    6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1 moyen
4    6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4 moyen
5    6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4 moyen
6    6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1 moyen
7    6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6 moyen
8    8 18.7 360.0 175 3.15 3.440 17.02  0  0    3    2  gros
9    8 17.3 275.8 180 3.07 3.730 17.60  0  0    3    3  gros
10   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4  gros
11   8 14.7 440.0 230 3.23 5.345 17.42  0  0    3    4  gros
12   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4  gros
13   8 16.4 275.8 180 3.07 4.070 17.40  0  0    3    3  gros
14   8 19.2 400.0 175 3.08 3.845 17.05  0  0    3    2  gros
15   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3  gros
16   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2  gros
17   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4  gros
18   8 15.8 351.0 264 4.22 3.170 14.50  0  1    5    4  gros
19   8 15.5 318.0 150 2.76 3.520 16.87  0  0    3    2  gros
20   8 15.0 301.0 335 3.54 3.570 14.60  0  1    5    8  gros
21   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4  gros

Si le nom des colonnes diffère ou que vous ne voulez pas regarder l’égalité entre toutes les variables ayant même nom, il faut le préciser dans les paramètres by (même noms de colonnes dans les deux tables), ou by.x et by.y pour dire quelles variables prendre dans la première table (by.x) et dans la deuxième table (by.y).

names(types)[1] = "nbcyl"
types
  nbcyl      type
1     6     moyen
2     8      gros
3    12 très gros
merge(mtcars, types, by.x = "cyl", by.y = "nbcyl")
   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb  type
1    6 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4 moyen
2    6 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4 moyen
3    6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1 moyen
4    6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4 moyen
5    6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4 moyen
6    6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1 moyen
7    6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6 moyen
8    8 18.7 360.0 175 3.15 3.440 17.02  0  0    3    2  gros
9    8 17.3 275.8 180 3.07 3.730 17.60  0  0    3    3  gros
10   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4  gros
11   8 14.7 440.0 230 3.23 5.345 17.42  0  0    3    4  gros
12   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4  gros
13   8 16.4 275.8 180 3.07 4.070 17.40  0  0    3    3  gros
14   8 19.2 400.0 175 3.08 3.845 17.05  0  0    3    2  gros
15   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3  gros
16   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2  gros
17   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4  gros
18   8 15.8 351.0 264 4.22 3.170 14.50  0  1    5    4  gros
19   8 15.5 318.0 150 2.76 3.520 16.87  0  0    3    2  gros
20   8 15.0 301.0 335 3.54 3.570 14.60  0  1    5    8  gros
21   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4  gros

Vous remarquerez, en le testant, que si on ne précise pas sur quelles variables faire la jointure, en l’absence de variables identiques entre les tables, la fonction merge() réalise le produit cartésien.

Dans les deux exemples ci-dessus, vous avez du voir que toutes les lignes ne son pas retournées. En effet, les voitures de mtcars avec cyl == 4 ne sont pas intégrées. De même que la dernière ligne de types. Pour avoir toutes les lignes, il faut ajouter le paramètre all = TRUE, pour lui dire de faire la jointure complète (i.e. FULL OUTER JOIN). Dans ce cas, on aura donc 33 lignes, avec des NA pour les cellules dont il n’a pas l’information.

names(types)[1] = "cyl"
merge(mtcars, types, all = TRUE)
   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb      type
1    4 22.8 140.8  95 3.92 3.150 22.90  1  0    4    2      <NA>
2    4 32.4  78.7  66 4.08 2.200 19.47  1  1    4    1      <NA>
3    4 22.8 108.0  93 3.85 2.320 18.61  1  1    4    1      <NA>
4    4 24.4 146.7  62 3.69 3.190 20.00  1  0    4    2      <NA>
5    4 21.5 120.1  97 3.70 2.465 20.01  1  0    3    1      <NA>
6    4 27.3  79.0  66 4.08 1.935 18.90  1  1    4    1      <NA>
7    4 30.4  75.7  52 4.93 1.615 18.52  1  1    4    2      <NA>
8    4 33.9  71.1  65 4.22 1.835 19.90  1  1    4    1      <NA>
9    4 26.0 120.3  91 4.43 2.140 16.70  0  1    5    2      <NA>
10   4 30.4  95.1 113 3.77 1.513 16.90  1  1    5    2      <NA>
11   4 21.4 121.0 109 4.11 2.780 18.60  1  1    4    2      <NA>
12   6 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4     moyen
13   6 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4     moyen
14   6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1     moyen
15   6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4     moyen
16   6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4     moyen
17   6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1     moyen
18   6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6     moyen
19   8 18.7 360.0 175 3.15 3.440 17.02  0  0    3    2      gros
20   8 17.3 275.8 180 3.07 3.730 17.60  0  0    3    3      gros
21   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4      gros
22   8 14.7 440.0 230 3.23 5.345 17.42  0  0    3    4      gros
23   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4      gros
24   8 16.4 275.8 180 3.07 4.070 17.40  0  0    3    3      gros
25   8 19.2 400.0 175 3.08 3.845 17.05  0  0    3    2      gros
26   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3      gros
27   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2      gros
28   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4      gros
29   8 15.8 351.0 264 4.22 3.170 14.50  0  1    5    4      gros
30   8 15.5 318.0 150 2.76 3.520 16.87  0  0    3    2      gros
31   8 15.0 301.0 335 3.54 3.570 14.60  0  1    5    8      gros
32   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4      gros
33  12   NA    NA  NA   NA    NA    NA NA NA   NA   NA très gros

On peut bien évidemment faire les jointures externes gauches (LEFT OUTER JOIN) ou droite (RIGHT OUTER JOIN) avec respectivement les paramètres all.x et all.y.

merge(mtcars, types, all.x = TRUE)
   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb  type
1    4 22.8 140.8  95 3.92 3.150 22.90  1  0    4    2  <NA>
2    4 32.4  78.7  66 4.08 2.200 19.47  1  1    4    1  <NA>
3    4 22.8 108.0  93 3.85 2.320 18.61  1  1    4    1  <NA>
4    4 24.4 146.7  62 3.69 3.190 20.00  1  0    4    2  <NA>
5    4 21.5 120.1  97 3.70 2.465 20.01  1  0    3    1  <NA>
6    4 27.3  79.0  66 4.08 1.935 18.90  1  1    4    1  <NA>
7    4 30.4  75.7  52 4.93 1.615 18.52  1  1    4    2  <NA>
8    4 33.9  71.1  65 4.22 1.835 19.90  1  1    4    1  <NA>
9    4 26.0 120.3  91 4.43 2.140 16.70  0  1    5    2  <NA>
10   4 30.4  95.1 113 3.77 1.513 16.90  1  1    5    2  <NA>
11   4 21.4 121.0 109 4.11 2.780 18.60  1  1    4    2  <NA>
12   6 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4 moyen
13   6 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4 moyen
14   6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1 moyen
15   6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4 moyen
16   6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4 moyen
17   6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1 moyen
18   6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6 moyen
19   8 18.7 360.0 175 3.15 3.440 17.02  0  0    3    2  gros
20   8 17.3 275.8 180 3.07 3.730 17.60  0  0    3    3  gros
21   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4  gros
22   8 14.7 440.0 230 3.23 5.345 17.42  0  0    3    4  gros
23   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4  gros
24   8 16.4 275.8 180 3.07 4.070 17.40  0  0    3    3  gros
25   8 19.2 400.0 175 3.08 3.845 17.05  0  0    3    2  gros
26   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3  gros
27   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2  gros
28   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4  gros
29   8 15.8 351.0 264 4.22 3.170 14.50  0  1    5    4  gros
30   8 15.5 318.0 150 2.76 3.520 16.87  0  0    3    2  gros
31   8 15.0 301.0 335 3.54 3.570 14.60  0  1    5    8  gros
32   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4  gros
merge(mtcars, types, all.y = TRUE)
   cyl  mpg  disp  hp drat    wt  qsec vs am gear carb      type
1    6 21.0 160.0 110 3.90 2.620 16.46  0  1    4    4     moyen
2    6 21.0 160.0 110 3.90 2.875 17.02  0  1    4    4     moyen
3    6 18.1 225.0 105 2.76 3.460 20.22  1  0    3    1     moyen
4    6 17.8 167.6 123 3.92 3.440 18.90  1  0    4    4     moyen
5    6 19.2 167.6 123 3.92 3.440 18.30  1  0    4    4     moyen
6    6 21.4 258.0 110 3.08 3.215 19.44  1  0    3    1     moyen
7    6 19.7 145.0 175 3.62 2.770 15.50  0  1    5    6     moyen
8    8 18.7 360.0 175 3.15 3.440 17.02  0  0    3    2      gros
9    8 17.3 275.8 180 3.07 3.730 17.60  0  0    3    3      gros
10   8 14.3 360.0 245 3.21 3.570 15.84  0  0    3    4      gros
11   8 14.7 440.0 230 3.23 5.345 17.42  0  0    3    4      gros
12   8 10.4 472.0 205 2.93 5.250 17.98  0  0    3    4      gros
13   8 16.4 275.8 180 3.07 4.070 17.40  0  0    3    3      gros
14   8 19.2 400.0 175 3.08 3.845 17.05  0  0    3    2      gros
15   8 15.2 275.8 180 3.07 3.780 18.00  0  0    3    3      gros
16   8 15.2 304.0 150 3.15 3.435 17.30  0  0    3    2      gros
17   8 10.4 460.0 215 3.00 5.424 17.82  0  0    3    4      gros
18   8 15.8 351.0 264 4.22 3.170 14.50  0  1    5    4      gros
19   8 15.5 318.0 150 2.76 3.520 16.87  0  0    3    2      gros
20   8 15.0 301.0 335 3.54 3.570 14.60  0  1    5    8      gros
21   8 13.3 350.0 245 3.73 3.840 15.41  0  0    3    4      gros
22  12   NA    NA  NA   NA    NA    NA NA NA   NA   NA très gros

Fonction setNames()

Cette fonction permet de renommer les colonnes d’un data.frame et de le renvoyer. Reprenons un exemple de calcul d’agrégat vu précédemment. Quelque soit le calcul indiqué, le nom de la colonne est toujours le même.

aggregate(mpg ~ am, mtcars, mean)
  am      mpg
1  0 17.14737
2  1 24.39231

Si nous voulons avoir dans un même tableau, la moyenne et l’écart-type, il nous faudrait faire une jointure. Mais l’idéal serait de renommer les tableaux correctement. On peut donc le faire avec setNames() dont voici un exemple de fonctionnement.

setNames(aggregate(mpg ~ am, mtcars, mean), c("am", "Moyenne"))
  am  Moyenne
1  0 17.14737
2  1 24.39231

Et du SQL directement

La librairie sqldf permet de réaliser des commandes SQL directement sur des data.frames. il faut simplement mettre la requête SQL en chaîne de caractère comme paramètre de la fonction sqldf(). Les seules restrictions sont que les RIGHT OUTER JOIN et FULL OUTER JOIN ne sont pas supportées (comme en SQLite).

library(sqldf)
sqldf("SELECT * FROM mtcars")
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
sqldf("SELECT * FROM mtcars WHERE mpg < 15")
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
2 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
3 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
4 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
5 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4
sqldf("SELECT hp, disp FROM mtcars WHERE mpg < 15")
   hp disp
1 245  360
2 205  472
3 215  460
4 230  440
5 245  350
sqldf("
SELECT *, 
        ROUND(1000 * wt / hp) AS rapport,
        ROUND(236 / mpg, 2) AS conso
    FROM mtcars
      ")
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb rapport conso
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      24 11.24
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4      26 11.24
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1      25 10.35
4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1      29 11.03
5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2      20 12.62
6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1      33 13.04
7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4      15 16.50
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      51  9.67
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2      33 10.35
10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4      28 12.29
11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4      28 13.26
12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3      23 14.39
13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3      21 13.64
14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3      21 15.53
15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4      26 22.69
16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4      25 22.69
17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4      23 16.05
18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1      33  7.28
19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2      31  7.76
20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1      28  6.96
21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1      25 10.98
22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2      23 15.23
23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2      23 15.53
24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4      16 17.74
25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2      22 12.29
26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      29  8.64
27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2      24  9.08
28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2      13  7.76
29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4      12 14.94
30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6      16 11.98
31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8      11 15.73
32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2      26 11.03
sqldf("
SELECT am, cyl, AVG(mpg), AVG(hp)
    FROM mtcars
    GROUP BY am, cyl
      ")
  am cyl AVG(mpg)   AVG(hp)
1  0   4 22.90000  84.66667
2  0   6 19.12500 115.25000
3  0   8 15.05000 194.16667
4  1   4 28.07500  81.87500
5  1   6 20.56667 131.66667
6  1   8 15.40000 299.50000
sqldf("
SELECT *
    FROM mtcars NATURAL JOIN types
      ")
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb  type
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 moyen
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 moyen
3  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 moyen
4  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2  gros
5  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 moyen
6  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4  gros
7  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4 moyen
8  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4 moyen
9  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3  gros
10 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3  gros
11 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3  gros
12 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4  gros
13 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4  gros
14 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4  gros
15 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2  gros
16 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2  gros
17 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4  gros
18 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2  gros
19 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4  gros
20 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6 moyen
21 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8  gros

Exercices

iris

A partir des données iris, déjà présentes dans R, créer les tableaux suivantes, à l’aide des fonctions aggregate() et merge() :

  • Moyenne
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
  • Ecart-type
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa    0.3524897   0.3790644    0.1736640   0.1053856
2 versicolor    0.5161711   0.3137983    0.4699110   0.1977527
3  virginica    0.6358796   0.3224966    0.5518947   0.2746501
  • Infos sur Sepal.Length
     Species Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median
1     setosa             4.300                4.800               5.000
2 versicolor             4.900                5.600               5.900
3  virginica             4.900                6.225               6.500
  Sepal.Length.Mean Sepal.Length.3rd Qu. Sepal.Length.Max.
1             5.006                5.200             5.800
2             5.936                6.300             7.000
3             6.588                6.900             7.900
  • Moyenne et médiane
      Espèce Moyenne Médiane
1     setosa   5.006     5.0
2 versicolor   5.936     5.9
3  virginica   6.588     6.5

heart.txt

Reprenez le jeu de données présent dans le fichier heart.txt.

Manipulation

  1. Créer un nouveau data.frame avec uniquement les individus masculins ayant un problème cardiaque
  2. Avec ces données, en créer un autre ne gardant que les variables suivantes :
    • type_douleur, sucre, electro, et vaisseau
    • angine, depression
  3. Créer un nouveau data.frame à partir de ce data.frame, avec
    1. une variable nbA comptant le nombre de fois où une variable des variables suivantes est égale à A : type_douleur, sucre, electro, et vaisseau
    2. une variable flag avec les deux modalités suivantes :
      • "problème" : angine à "oui" et depression supérieur ou égal à 4.0
      • "attention" : sinon

Agrégats

  1. Comparer le cholesterol selon la présence ou non de problème de coeur
  2. Calculer le nombre de personnes concernés par un problème de coeur
  3. Fusionner les deux data.frames précédement créés pour avoir les informations en une seule table
  4. Calculer les moyennes de chaque variable quantitative selon la présence ou non de problème de coeur
  5. Comparer l’âge selon la présence ou de problème de coeur et de problème d’angine