TD3 : Les data-frames

C’est peut-être l’objet le plus important et le plus utilisé dans R. Il s’agit d’un tableau de données, mais contrairement aux matrices, on peut avoir différents types de données dans un même data-frame.

1 Création d’un data frame

  • On crée deux variables x et y contenant \(n=100\) nombres distribués selon une loi uniforme continue sur [0,20] (fonction runif()) et une variable gr.

Expliquer le résultat du code correspondant (la fonction round() permet d’arrondir).

x <- round(runif(100,0,20),1)
y <- round(runif(100,0,20),1)
gr <- sample(c("ING1","ING2"),size=100,replace=T,prob=c(0.6,0.4))
df<-data.frame(NoteF=x,NoteM=y,gr=gr)
  • L’indexation des éléments dans un data-frame est la même que dans une matrice :
df[1,1]
[1] 4.5
  • On peut également sélectionner une colonne du data-frame via $
df$NoteF
  [1]  4.5  7.8  5.8  4.7 17.4  9.0  9.1  2.1 13.7 17.4  7.6 15.9 13.2  7.1 16.2
 [16] 10.3 12.3 18.4  8.8 14.4  9.9 18.8  6.5 16.8 17.0 18.4 10.8 18.2  5.6  9.1
 [31] 12.2 10.4 15.7  9.2 19.0  0.1  7.1  2.6  7.6  3.1 12.3 11.7  4.6  8.1 11.2
 [46]  4.2 12.6 10.2 11.2 19.1  2.7 13.6 17.9 12.5  4.2  6.4 10.9 18.0 19.9 14.7
 [61]  9.3  1.1 10.3  9.5 17.6 17.9  1.7 14.1 17.5  6.2 10.0 12.0  0.5  0.3 17.4
 [76] 12.5 14.6 14.7  6.7  4.9 18.0 19.0  4.4 11.2  9.1  8.5  6.5 19.0  7.7 11.6
 [91]  0.9 16.7 11.7  5.4 14.6 12.9 19.3  1.7  6.3 10.5

2 Importation d’un data frame inclus dans un package

  • Pour accéder aux data-frames de R :
data()
  • Grâce à la fonction help(), on peut obtenir de l’aide sur l’un des data-frames :
help("mtcars")
  • On charge ensuite le jeu de données :
data("mtcars")
  • Une fois le data frame importé on constate qu’il est présent dans la fenêtre environnement.

Fenêtre environnement

3 Importation d’une base de données externe

On peut utiliser une interface graphique pour ouvrir les fichiers contenant un data-frame. Les plus courants sont :

  • *.csv (Comma Separed Values) : ce sont des fichiers de type tableaux sans mise en forme;
  • *.xlsx : fichiers produits à partir du logiciel excel;
  • *.ods : fichiers produits à partir du logiciel Calc de LibreOffice.

Ces fichiers peuvent s’importer dans l’environnement de travail avec les fonctions read.csv(), read.table(), ou read.xlsx() du package readxl.

Exercice

  1. Importer le data-frame contenu dans le fichier bordeaux.csv disponible sur Connect (à télécharger, et à placer dans le bon répertoire). Il s’agit des données de vin de Bordeaux issues de Méthodes statistiques en gestion de M. Tenenhaus, Dunod, 1994.
Voir la correction
bordeaux <- read.csv("bordeaux.csv",
                     header = TRUE,row.names = 1)
  1. A quoi correspondent les paramètres headeret row.names ?

4 Quelques fonctions utiles pour les data-frames

4.1 La fonction summary()

Cette fonction permet de résumer l’ensemble des variables du data-frame.

summary(df)
     NoteF           NoteM             gr           
 Min.   : 0.10   Min.   : 0.000   Length:100        
 1st Qu.: 6.50   1st Qu.: 4.875   Class :character  
 Median :10.65   Median :10.150   Mode  :character  
 Mean   :10.74   Mean   :10.228                     
 3rd Qu.:14.95   3rd Qu.:15.350                     
 Max.   :19.90   Max.   :19.900                     

4.2 La fonction apply()

La fonction apply() permet d’appliquer une fonction sur les lignes (MARGIN=1) ou les colonnes (MARGIN=2) d’un data-frame. Par exemple si on souhaite appliquer la fonction moyenne (mean()) sur les colonnes du data frame df, on utilise :

apply(df[,1:2],MARGIN=2,mean)
 NoteF  NoteM 
10.736 10.228 

Remarque : on n’a utilisé que les deux premières colonnes du data-frame car la troisième n’est pas numérique (donc on ne peut pas calculer sa moyenne).

4.3 La fonction factor()

Cette fonction va être très importante pour la suite, et en particulier lorsque l’on va manipuler des jeux de donnnées en statistique.

  • Un facteur est une variable qualitative (i.e. non numérique). Les valeurs prises par cette variable sont appelées modalités.

Exemples :

  • Une variable qualitative peut décrire, pour un aliment, le type de nourriture (modalités : Confiserie, Viande, Fruit, Légume,…).

  • Dans un sondage, une variable qualitative peut décrire le sexe de l’individu (modalités : Homme, Femme, Non binaire).

  • Il peut arriver que ces modalités soient codées. Par exemple dans certains jeux de données, on connaîtra le statut professionnel des participants (modalités : en activité, en recherche d’emploi, étudiant, à la retraite) mais on peut avoir choisi de coder les modalités par des nombres (ici de 1 à 4) mais cette variable demeure un facteur.

statut_pro<-sample(1:4,100,replace=TRUE)
## R ne voit pas qu'il s'agit d'un facteur car les modalités sont numériques
class(statut_pro)
[1] "integer"
table(statut_pro)
statut_pro
 1  2  3  4 
28 24 26 22 
  • On utilise la fonction factor() pour spécifier à R qu’il s’agit d’une variable qualitative. On voit le changement à travers class() ou levels() :
statut_pro<-factor(statut_pro)
class(statut_pro)
[1] "factor"
levels(statut_pro)
[1] "1" "2" "3" "4"
levels(statut_pro)<-c("en activité", "en recherche d'emploi",
                      "étudiant", "à la retraite")
table(statut_pro)
statut_pro
          en activité en recherche d'emploi              étudiant 
                   28                    24                    26 
        à la retraite 
                   22 

Remarque : Les variables binaires (facteurs à deux modalités) sont souvent codées 0/1.

  • On peut être amené à vouloir avoir les modalités d’un facteur classées dans un certain ordre. Pour ce faire, on va utiliser la fonction labels() avec l’ordre choisi :
statut_pro<-factor(statut_pro,labels=c("étudiants","en activité",
                                       "en recherche d'emploi","à la retraite"))
table(statut_pro)
statut_pro
            étudiants           en activité en recherche d'emploi 
                   28                    24                    26 
        à la retraite 
                   22 

Attention les labels doivent être exactement écrits de la même façon que les levels si les modalités sont déjà écrites et sinon on peut directement agir sur les modalités via labels :

data("mtcars")
help("mtcars")
mtcars$vs<-factor(mtcars$vs,levels=0:1,labels=c("V-shaped","straight"))
mtcars$am<-factor(mtcars$am,levels=0:1,labels=c("automatic","manual"))

5 Exercices

5.1 Exercice 1

  1. Charger le fichier de données iris. Lire l’aide de iris pour comprendre le jeu de données.
Voir la correction
data(iris)
?iris
  1. Quel est le type de iris ? Quelles sont les dimensions de iris ?
Voir la correction
class(iris) # Il s'agit d'un data-frame
dim(iris)   # Il y a 150 lignes (individus) et 5 colonnes (variables)
  1. Appliquer la fonction str() à iris. A quoi correspondent les informations renvoyées ?
str(iris) # Résumé rapide des variables
  1. Appliquer la fonction summary() à iris. A quoi correspondent les informations renvoyées ?
summary(iris) # Résumé détaillé des variables
  1. Utiliser les fonctions colnames() et rownames(). Quelles sont les informations renvoyées ?
Voir la correction
colnames(iris) # Nom des colonnes (ou des variables)
rownames(iris) # Nom des individus (ici, juste un nombre)
  1. A l’aide la fonction de texte paste() remplacer le nom des lignes par fleur_1, …, fleur_150.
Voir la correction
rownames(iris) <- paste("fleur_",1:150,sep="")
  1. Pour un data-frame on peut appeler une colonne par son nom en utilisant $ : iris$Sepal.Length. En utilisant cette information donner la classe de la colonne Species.
Voir la correction
class(iris$Species) # Il s'agit d'un facteur
  1. Quels sont les niveaux du facteur Species (fonction levels()) ?
Voir la correction
levels(iris$Species) #Il y a 3 niveaux (ou classes) : setos, versicolor et virginica
  1. Créer une nouvelle colonne nommée groupe (on pensera à $) dans le data frame iris identique à la colonne Species. Quelle est la classe de cette nouvelle colonne ?
Voir la correction
iris$groupe <- iris$Species
class(iris$groupe) # Il s'agit toujours d'un facteur
  1. Renommer les niveaux de la colonne groupe en A, B, C (A pour setosa, B pour versicolor, C pour virginica). Afficher les indices des lignes de iris correspondant au groupe B.
Voir la correction
iris$groupe <- factor(iris$groupe,
                      levels = c("setosa","versicolor","virginica"),
                      labels = c("A","B","C"))
  1. Créer l’ensemble des numéros de lignes correspondant aux fleurs du groupe A. Afficher les lignes de iris correspondant au groupe A.
Voir la correction
which(iris$groupe =="A") # Numéros de lignes
iris[iris$groupe=="A",]  # Affichage de ces lignes
  1. En adoptant la même logique que la question précédente, afficher uniquement les lignes de irisSepal.Length est inférieur à 5.
Voir la correction
which(iris$Sepal.Length <5 ) # Numéros de lignes
iris[iris$Sepal.Length <5,]  # Affichage de ces lignes
  1. Combien y a-t-il d’individus ayant la longueur des sépales inférieure à 5 ?
Voir la correction
nrow(iris[iris$Sepal.Length <5,])  # Affichage de ces lignes

5.2 Exercice 2

  1. Charger le data-frame mtcars. Combien de véhicules et de caractéristiques sur les véhicules sont contenus dans le data frame ?
Voir la correction
data("mtcars")
dim(mtcars) # 32 véhicules détaillés selon 11 caractéristiques
  1. Deux caractéristiques sont mal identifiées dans le data-frame car ce sont des variables qualitatives (facteurs). Rectifier en utilisant la fonction as.factor().
Voir la correction
# Il s'agit des variables vs et am
# vs : indique le type de moteur, mais codé en 0-1
# am : indique le type de transmission, codé 0 = automatique, 1=manuelle

mtcars$vs <- as.factor(mtcars$vs)
mtcars$am <- as.factor(mtcars$am)
  1. En utilisant l’aide du data-frame mtcars renommer les niveaux des deux facteurs précédents.
Voir la correction
mtcars$vs <- factor(mtcars$vs,
                    levels=c(0,1),
                    labels = c("V-shaped","Straight"))
mtcars$am <- factor(mtcars$am,
                    levels=c(0,1),
                    labels=c("Automatic","Manual"))
  1. Etablir la table de contingence de ces deux facteurs (fonction table())
Voir la correction
table(mtcars[,c("vs","am")]) # O ne sélectionne que les colonnes qui nous intéressent
  1. Calculer la moyenne des 7 premières variables (on utilisera les fonctions mean() et apply()).
Voir la correction
apply(X = mtcars[,1:7],MARGIN = 2,FUN = mean)
  1. Reprendre la question précédente pour les voitures avec un moteur à plat. De même pour les voitures ayant un moteur en V et qui sont automatiques.
Voir la correction
apply(X = mtcars[mtcars$vs=="Straight",1:7],MARGIN = 2,FUN=mean) # Pour les moteurs à plat
apply(X = mtcars[mtcars$vs=="V-shaped" & mtcars$am== "Automatic" ,1:7],
      MARGIN = 2,FUN=mean) # Pour les moteurs en V avec transmission automatique
  1. Calculer le nombre de voitures ayant un moteur en V qui ont au moins 3 carburateurs.
Voir la correction
sum(mtcars$vs=="V-shaped" & mtcars$carb >=3)