Dans ce TP, nous allons utilier la base de données publique des médicaments. Dans la page Téléchargement (lien situé tout en bas du site), vous trouverez les liens vers un fichier explicatif (en PDF) et les fichiers de données (au format texte).

Vous devez déjà tous les télécharger (9 fichiers au total), et les placer idéalement dans un répertoire dédié.

Importation de données texte

Il est possible d’importer des données provenannt de fichiers texte avec la commande read.table(), qui a les paramètres principaux suivants (avec valeur par défaut éventuelle) :

  • file : nom du fichier
  • header : présence ou non des noms de variables (FALSE)
  • sep : séparateur de variable (` `)
  • na.strings : chaîne(s) pour valeurs manquantes (NA)
  • skip : nombre de lignes à ne pas prendre en compte en début de fichier (0)
  • nrow : nombre de lignes à lire (-1 : toutes les lignes)
  • stringsAsFactors : transformations des chaînes en factor ou non (TRUE)
  • quote : symbole(s) pour les chaînes de caractères ('" - attention aux apostrophes en français donc)

Cette fonction renvoie un objet de type data.frame.

Il existe quelques fonctions dérivés avec des valeurs par défaut différentes

  • read.csv(), read.csv2()
  • read.delim(), read.delim2()

Par exemple, nous disposons du fichier heart.txt, contenant les données de 270 personnes.

impossible à afficher

Nous remarquons les points suivants :

  • le nom des colonnes est présent dans la première ligne
  • le séparateur de colonnes est la tabulation ("\t")

Pour importer ce fichier, nous devons donc utiliser le code suivant. Vous devez d’abord télécharger le fichier. Attention : il est supposé ici que le fichier est dans un sous-répertoire donnees du répertoire de travail.

heart = read.table("donnees/heart.txt", header = T, sep = "\t")
head(heart)
##   age     sexe type_douleur pression cholester sucre electro taux_max
## 1  70 masculin            D      130       322     A       C      109
## 2  67  feminin            C      115       564     A       C      160
## 3  57 masculin            B      124       261     A       A      141
## 4  64 masculin            D      128       263     A       A      105
## 5  74  feminin            B      120       269     A       C      121
## 6  65 masculin            D      120       177     A       A      140
##   angine depression pic vaisseau    coeur
## 1    non        2.4   2        D presence
## 2    non        1.6   2        A  absence
## 3    non        0.3   1        A presence
## 4    oui        0.2   2        B  absence
## 5    oui        0.2   1        B  absence
## 6    non        0.4   1        A  absence

Il est aussi possible d’écrire un fichier texte à partir d’un data.frame, en spécifiant aussi les paramètres d’écriture. Par exemple, le code suivant écrit les données heart_bis dans un autre formalisme.

  • le séparateur de colonnes est le "%"
  • les noms des colonnes sont bien écrits
  • le nom des lignes ne sont incluses
  • le séparateur de décimales est la virgule (","), comme en français
  • il n’y a pas de "" ou de '' autour des chaînes de caractères
write.table(heart, file = "donnees/heart_bis.txt", sep = "%", 
            row.names = FALSE, col.names = TRUE, dec = ",", quote = FALSE)
impossible à afficher

Il est parfois difficile de lire directement avec la commande read.table() ou ses dérivés. On peut utiliser dans ce cas la commande readLines(), qui comme son nom l’indique, lit les lignes les unes après les autres. Elle renvoie un tableau de chaîne de caractères, chaque valeur du tableau correspondant à une ligne.

heart_lignes = readLines("donnees/heart.txt")
length(heart_lignes)
## [1] 271
heart_lignes[1]
## [1] "age\tsexe\ttype_douleur\tpression\tcholester\tsucre\telectro\ttaux_max\tangine\tdepression\tpic\tvaisseau\tcoeur"
heart_lignes[2]
## [1] "70\tmasculin\tD\t130\t322\tA\tC\t109\tnon\t2.4\t2\tD\tpresence"

Attributs d’un objet

Dans R, tout objet peut avoir un ou plusieurs attributs, en particulier les data.frames, comme par exemple la classe de l’objet, le nom des colonnes, et le nom des lignes. On peut avoir la liste des attributs avec la commande attributes(). Celle-ci nous renvoie une list contenant des objets nommés.

attributes(mtcars)
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"

On peut accéder à chaque objet de cette liste via le nom de l’objet, de deux façons différentes, comme présenté ci-dessous.

attributes(mtcars)$names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
attr(mtcars, "names")
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

Il est aussi possible de définir de nouveaux attributs à un data.frame, via la commande attr(). Celui-ci ne sera pas visible lorsqu’on l’affichera, mais auquel on pourra accéder directement avec les commandes ci-dessus.

attr(mtcars, "info") = "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"
mtcars$info
## NULL
attributes(mtcars)
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"
## 
## $info
## [1] "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"
attr(mtcars, "info")
## [1] "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"

Dates

Comme dans tous les systèmes, les dates sous R sont stockées sous forme d’entiers représentant un nombre de jours depuis une certaine date, sous le format Date. Ci-dessous, nous voyons comment récupérer la date du jour, le nombre de jour depuis l’origine, et le calcul de la date d’origine. Il y a aussi deux exemples d’affichage amélioré d’une date (la date du jour ici).

# Date du jour
Sys.Date()
## [1] "2017-09-25"
# Entier stocké
as.numeric(Sys.Date())
## [1] 17434
# Date d'origine (et exemple de soustraction de jours d'une date)
Sys.Date() - as.numeric(Sys.Date())
## [1] "1970-01-01"
# Affichage d'une date avec un format spécifique
format(Sys.Date(), "jour : %d ou %e, mois : %m, année :  %y ou %Y")
## [1] "jour : 25 ou 25, mois : 09, année :  17 ou 2017"
# Affichage d'une date dépendant de la langue locale
format(Sys.Date(), "%a %e %b ou %A %e %B")
## [1] "lun. 25 sept. ou lundi 25 septembre"

Il est aussi possible de transformer une chaîne de caractère en Date avec la fonction as.Date(). Celle-ci prend en paramètre obligatoire un vecteur de chaînes (éventuellement avec une seule valeur), et de façon optionnelle le format de la date. Voici quelques exemples d’utilisations de cette fonction, avec la présentation des fonctions weekdays(), months(), quarters() et julian().

# Tentative de conversion d'une date écrite en "français"
as.Date("09/11/2016")
## [1] "9-11-20"
# En spécifiant le format, tout est ok
as.Date("09/11/2016", "%d/%m/%Y")
## [1] "2016-11-09"
# Récupération d'informations de cette date
d = as.Date("09/11/2016", "%d/%m/%Y")
weekdays(d) # jour de la semaine
## [1] "mercredi"
months(d)   # mois dans l'année
## [1] "novembre"
quarters(d) # trimestre dans l'année
## [1] "Q4"
julian(d)   # nombre de jour depuis l'origine (éventuellement spécifié, cf ci-dessous)
## [1] 17114
## attr(,"origin")
## [1] "1970-01-01"
julian(d, as.Date("1900-01-01"))
## [1] 42681
## attr(,"origin")
## [1] "1900-01-01"

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 fonction 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

Exercices

Importation

La première étape ici est donc d’importer les données. Il faut pour cela utiliser la fonction read.table(), en évitant que les variables textuelles deviennent des factors. Il faut aussi renommer les variables pour chaque table, selon les informations fournies dans le PDF associé aux données. Il faut aussi gérer les dates pour qu’elles soient correctement représentées. Pour certaines variables, nous avons le descriptif des modalités dans ce document. Enfin, il faudrait ajouter le court descriptif de chaque table comme attribut de celles-ci.

Interrogation

  1. On veut les informations suivantes dans une table à deux colonnes (statistique, valeur) :
    • Nombre de médicaments
    • Nombre de médicaments avec autorisation active
    • Nombre de médicaments avec surveillance renforcée
    • Taux moyen de remboursement (pour ceux avec autorisation active)
    • Prix moyen (idem que le taux)
    • Durée moyenne de leur mise sur le marché (en nombre de jours - idem que le taux)
  2. Quels sont les dix médicaments avec le plus de composants (Code CIS, Dénomination et nombre de composants) ?
  3. Pour chaque type de générique, on veut savoir le nombre de médicaments associés, ainsi que leur taux de remboursement moyen et leur prix moyen.
  4. Quelles sont les voies d’administration possibles ? Et combien de médicaments sont concernés pour chaque voie ?
  5. Quels sont les médicaments dont le service médical rendu (ou SMR) est jugé insuffisant ? Indiquez leur taux de remboursement et leur prix, en les classant par prix décroissant.

NB :

  • les taux et les prix sont dans au format chaîne de caractères (resp. "xx %" et "xx,xx") et donc à modifier avant calcul.
  • les voies d’administration sont listées dans une seule variable, et séparées par des “;” (par exemple "cutanée;orale;sublinguale"). Il faut donc ici aussi faire un pré-traitement.