Alors que les vecteurs atomiques imposent que tous leurs éléments soient rigoureusement du même type, la liste est la structure la plus flexible de R : elle peut stocker des éléments de types et de dimensions totalement différents (des nombres, du texte, des vecteurs, des matrices, d'autres listes et même des fonctions entières !).
En R, la majorité des objets complexes — notamment les résultats des régressions linéaires (lm()) ou des tests d'hypothèses (t.test()) — sont des listes sous le capot.
1. Création d'une liste avec list()#
Pour construire une liste, on utilise la fonction list(), en nommant idéalement chaque élément pour en faciliter la manipulation future :
etudiant <- list(
id = 1042,
nom = "Claire Dupont",
inscrit = TRUE,
notes = c(14.5, 18, 12),
adresse = list(ville = "Lyon", code_postal = "69001")
)
# Affichage de la structure globale avec str()
str(etudiant)
Sortie :
List of 5
$ id : num 1042
$ nom : chr "Claire Dupont"
$ inscrit: logi TRUE
$ notes : num [1:3] 14.5 18 12
$ adresse:List of 2
..$ ville : chr "Lyon"
..$ code_postal: chr "69001"
2. L'art de l'indexation : [] vs [[]] vs $#
C'est l'un des points fondamentaux qui déroute souvent les débutants en R :
┌────────────────────────────────────────────────────────┐
│ Indexation d'une Liste │
├────────────┬───────────────────────────────────────────┤
│ liste[1] │ Renvoie une SOUS-LISTE contenant │
│ │ le 1er élément. │
├────────────┼───────────────────────────────────────────┤
│ liste[[1]] │ Renvoie le CONTENU RÉEL du 1er élément. │
├────────────┼───────────────────────────────────────────┤
│ liste$nom │ Renvoie le CONTENU RÉEL de l'élément nommé│
└────────────┴───────────────────────────────────────────┘
[!NOTE] L'analogie de la boîte de chocolats :
Si une liste est un carton contenant des boîtes de chocolats : *liste[1]vous donne un petit carton contenant la première boîte de chocolats. *liste[[1]]ouvre la boîte et vous donne directement le chocolat qui est à l'intérieur !
Démonstration :#
# Extraction par le nom ($)
etudiant$nom # [1] "Claire Dupont" (vecteur caractère)
etudiant$notes # [1] 14.5 18.0 12.0 (vecteur numérique)
mean(etudiant$notes) # [1] 14.83333
# Accéder à un sous-élément imbriqué
etudiant$notes[2] # La 2e note : [1] 18
etudiant$adresse$ville # [1] "Lyon"
# Différence entre crochet simple et double crochet
class(etudiant[1]) # [1] "list"
class(etudiant[[1]]) # [1] "numeric"
3. Modifier, ajouter et supprimer des éléments#
Une liste est mutable : vous pouvez l'enrichir à tout moment par simple affectation :
# Ajouter un nouvel élément
etudiant$filiere <- "Data Science"
# Modifier un élément existant
etudiant$id <- 2050
# Supprimer un élément en lui affectant NULL
etudiant$inscrit <- NULL
# Vérifier les noms des éléments restants
names(etudiant) # [1] "id" "nom" "notes" "adresse" "filiere"
Mise en pratique#
- Créez une liste nommée
modele_statcomprenant les trois éléments suivants : nom:"Régression Linéaire"coefficients: un vecteur avec les valeursc(2.4, 0.85, -1.2)r_deux:0.94- Extrayez le coefficient associé à la deuxième variable (0.85).
- Ajoutez à votre liste un élément
significatifvalantTRUE. - Affichez la structure de votre liste à l'aide de la commande
str(modele_stat).
Commentaires