Chapitre 2 Les objets R

On commencera par créer un répertoire dans lequel on mettra tous les fichiers du tutoriel. On pourra créer un projet avec Rstudio dans lequel on placera ces fichiers (File -> New Project…). Par défaut, le répertoire de travail se situera dans le répertoire de ce projet. On peut le vérifier avec la commande

getwd()

La commande setwd permet de changer le répertoire de travail si besoin. On peut aussi le faire en utilisant le menu Session -> Set Working directory -> Choose directory….

2.1 Création d’objets

2.1.1 Numérique

On crée un objet R en assignant une valeur (ou un caractère, vecteur…) avec les opérateurs <-, ->, =

b <- 41.3  # assigne la valeur 41.3 à l'objet b
x <- b     # b est assigné à x
x = b      # b est assigné à x
b -> x     # b est assigné à x
is.numeric(b)
[1] TRUE
mode(b)
[1] "numeric"

2.1.2 Caractère

Les chaines de caractères sont définies avec des guillemets : "chaine", par exemple

x <- "La mort"
y <- "aux trousses"
paste(x,y)
[1] "La mort aux trousses"
is.character(x)
[1] TRUE

2.1.3 Facteur

L’objet facteur est très utile pour travailler avec des variables qualitatives. Cet objet permet d’identifier les modalités prisent par la variable et de travailler dessus, en changeant par exemple le nom d’une modalité :

V1 <- factor(c("less20years","more50years","less20years","more50years","less20years"))
V1
[1] less20years more50years less20years more50years
[5] less20years
Levels: less20years more50years
levels(V1)
[1] "less20years" "more50years"
levels(V1) <- c("Young","Old")
V1
[1] Young Old   Young Old   Young
Levels: Young Old

2.1.4 Logique (Booléen)

x <- TRUE
is.logical(x)
[1] TRUE
mode(x)
[1] "logical"
a <- 1
a==1
[1] TRUE
a!=1
[1] FALSE
a<0
[1] FALSE
a>0
[1] TRUE

2.2 Vecteur

On peut définir un vecteur de plusieurs façons :

  • fonction collect c

    x <- c(1.2,5,9,11)
    x
    [1]  1.2  5.0  9.0 11.0
  • opérateur séquence :

    1:5
    [1] 1 2 3 4 5
  • fonction séquence seq

    seq(1,10,by=2)
    [1] 1 3 5 7 9
    seq(0,1,length=10)
     [1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444
     [6] 0.5555556 0.6666667 0.7777778 0.8888889 1.0000000
  • fonction rep

    rep(1,4)
    [1] 1 1 1 1
    rep(c(1,3),each=3)
    [1] 1 1 1 3 3 3

On peut aussi créer des vecteurs caractère ou logique

x <- c("A","B","C")
x <- rep("A",5)
paste("X",1:5,sep="-")
[1] "X-1" "X-2" "X-3" "X-4" "X-5"
substr("statistician",5,9)
[1] "istic"
c(T,F,T)
[1]  TRUE FALSE  TRUE

2.2.1 Sélectionner une partie d’un vecteur

La sélection s’effectue à l’aide de crochets [ ]

x <- c(-4,-3,1,3,5,8,0)
x[2]
[1] -3
x[c(2,5)]
[1] -3  5
x>0
[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
x[x>0]
[1] 1 3 5 8

2.2.2 Opérations sur les vecteurs

On peut facilement additionner, multiplier des vecteurs :

x <- seq(-10,10,by=2)
y <- 1:length(x)
x+y
 [1] -9 -6 -3  0  3  6  9 12 15 18 21
x*y
 [1] -10 -16 -18 -16 -10   0  14  32  54  80 110
z <- x>0
x*z
 [1]  0  0  0  0  0  0  2  4  6  8 10
Exercice 2.1 (Manipulation de vecteurs)
  1. Calculer la moyenne, la somme, la médiane et la variance du vecteur (1,3,8,9,11).

  2. Créer les vecteurs suivants en utilisant la fonction rep.

    vec1 = 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 
    vec2 = 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
    vec3 = 1 1 2 2 2 3 3 3 3 4 4 4 4 4
  3. Créer le vecteur suivant à l’aide de la fonction paste.

    vec4 = "A0)" "A1)" "A2)" "A3)" "A4)" "A5)" "A6)" "A7)" "A8)" "A9)" "A10)"
  4. letters est un vecteur qui contient les 26 lettres de l’alphabet.

    1. Trouver le numéro de la lettre \(q\) (sans compter “avec les doigts” !). On pourra utiliser la fonction which.

    2. Créer le vecteur “a1”,“b2”,\(\dots\) jusqu’à \(q\) et son index.

2.3 Matrices

La fonction matrix permet de définir des matrices.

m <- matrix(1:4,ncol=2)
m
     [,1] [,2]
[1,]    1    3
[2,]    2    4
m <- matrix(1:4,nrow=2)
m
     [,1] [,2]
[1,]    1    3
[2,]    2    4
m <- matrix(1:4,nrow=2,byrow=TRUE)
dim(m)
[1] 2 2

La position d’un élément dans une matrice est indiquée par ses numéros de ligne et de colonne. Ainsi, pour sélectionner le terme de la 2ème ligne et la 1ère colonne, on utilisera

m[2,1]
[1] 3

On peut aussi extraire des lignes et des colonnes :

m[1,] #première ligne
[1] 1 2
m[,2] #deuxième colonne
[1] 2 4

Il n’est pas difficile de faire les calculs usuels sur les matrices :

det(m) #déterminant
[1] -2
solve(m) #inverse
     [,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5
t(m) #transposé
     [,1] [,2]
[1,]    1    3
[2,]    2    4
n <- matrix(5:8,nrow=2)
m+n
     [,1] [,2]
[1,]    6    9
[2,]    9   12
m*n #attention : produit de Hadamart
     [,1] [,2]
[1,]    5   14
[2,]   18   32
m%*%n #Produit matriciel
     [,1] [,2]
[1,]   17   23
[2,]   39   53
eigen(m) #Décomposition en valeurs propres
eigen() decomposition
$values
[1]  5.3722813 -0.3722813

$vectors
           [,1]       [,2]
[1,] -0.4159736 -0.8245648
[2,] -0.9093767  0.5657675

2.4 Listes

Une liste est un objet hétérogène. Elle permet de stocker des objets de différents modes dans un même objet. Par exemple, on peut céer une liste qui contient un vecteur et une matrice à l’aide de

mylist <- list(vector=rep(1:5),mat=matrix(1:8,nrow=2))
mylist
$vector
[1] 1 2 3 4 5

$mat
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
length(mylist)
[1] 2

L’extraction s’effectue en indiquant la position de l’objet à extraire dans un double crochet [[ ]] :

mylist[[1]]
[1] 1 2 3 4 5

On peut aussi utiliser le nom de l’élément à extraire :

mylist$mat
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8
mylist[["mat"]]
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

2.5 Dataframe

Les dataframes sont des listes particulières dont les composantes ont la même longueur, mais potentiellement des modes différents. C’est l’objet généralement utilisé pour les tableaux de données (qui contiennent souvent des variables quantitatives et qualitatives). Par exemple,

name <- c("Paul","Mary","Steven","Charlotte","Peter")
sex <- factor(c("M","F","M","F","M"))
size <- c(180,165,168,170,175)
data <- data.frame(name,sex,size)
summary(data)
     name           sex        size      
 Length:5           F:2   Min.   :165.0  
 Class :character   M:3   1st Qu.:168.0  
 Mode  :character         Median :170.0  
                          Mean   :171.6  
                          3rd Qu.:175.0  
                          Max.   :180.0  

On observe que name est un vecteur de caractères, sex un facteur et size un vecteur numérique.

L’extraction est similaire aux matrices et aux listes :

data[2,3]
[1] 165
data[,2]
[1] M F M F M
Levels: F M
data$sex
[1] M F M F M
Levels: F M

2.6 Quelques fonctions importantes

  • summary produit un résumé d’un objet

    summary(data)
         name           sex        size      
     Length:5           F:2   Min.   :165.0  
     Class :character   M:3   1st Qu.:168.0  
     Mode  :character         Median :170.0  
                              Mean   :171.6  
                              3rd Qu.:175.0  
                              Max.   :180.0  
    summary(1:10)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       1.00    3.25    5.50    5.50    7.75   10.00 
  • mean, sum, median, var, min, max… (facile à comprendre)

  • sort, order

    x <- c(1,8,5,4)
    sort(x)
    [1] 1 4 5 8
    order(x)
    [1] 1 4 3 2
  • apply applique une fonction f aux lignes ou colonnes d’une matrice ou dataframe

    V1 <- 1:10
    V2 <- seq(-20,25,length=10)
    df <- data.frame(V1,V2)
    apply(df,1,mean)
     [1] -9.5 -6.5 -3.5 -0.5  2.5  5.5  8.5 11.5 14.5 17.5
    apply(df,2,sum)
    V1 V2 
    55 25 

2.7 Exercices complémentaires

Exercice 2.2 (Manipulation de matrices)
  1. Créer la matrice suivante que l’on appellera mat (on pourra utiliser les fonctions rownames et colnames) :

    column 1 column 2 column 3 column 4
    row-1 1 5 5 0
    row-2 0 5 6 1
    row-3 3 0 3 3
    row-4 4 4 4 2
  2. Créer un vecteur qui contient la diagonal de mat.

  3. Créer une matrice qui contient les 2 premières lignes de mat.

  4. Créer une matrice qui contient les 2 dernières colonnes de mat.

  5. Calculer le déterminant et l’inverse de mat.

Exercice 2.3 (Manipulations simples sur un jeu de données)

On considère le jeu de données iris disponible dans R :

data(iris)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
  1. Calculer les moyennes et variances des variables Sepal.Width et Petal.Length.

  2. Créer un sous jeu de données qui contient uniquement les iris de l’espèce versicolor. On appellera ce tableau iris2.

  3. Ordonner les individus dans iris2 par valeurs décroissantes de la variable Sepal.Length (on pourra utiliser la fonction order).

  4. Calculer les valeurs moyennes de Sepal.Length pour chaque espèce.

  5. Ajouter une variable (qu’on appellera sum.Petal) dans le dataframe iris qui contiendra la somme de Petal.Length et Petal.Width.

Exercice 2.4 (Fonction apply)
  1. Calculer les indicateurs numériques standards (moyenne, min, max, etc.) des 3 variables du jeux de données ethanol (disponible dans le package lattice).

    library(lattice)
    data("ethanol")
  2. Calculer les quartiles de chaque variables. On pourra faire un apply avec la fonction quantile.

  3. Faire de même pour les déciles.

Exercice 2.5 (Données manquantes)

On considère le jeu de données presidents

data("presidents")
df <- matrix(presidents,ncol=4,byrow=T)
  1. Est-ce que la ligne 20 contient au moins une données manquante ? On pourra utiliser la fonction any.

  2. Quelles sont les lignes de df qui contiennent au moins une donnée manquante ? On pourra utiliser la fonction which.

  3. Supprimer les lignes de df qui contiennent au moins une donnée manquante.