6 Les listes
La liste sont les structures les moins rigides et les plus polyvalentes du langage R. Il s’agit d’un objet spécial dont les éléments peuvent être de toute nature (y compris d’autres listes). Pour créer une liste, il suffit d’utiliser la fonction list()
et d’écrire entre les parenthèses les différents éléments.
# Les objets à mettre dans une liste
<- c(45, 12, 56, 14, 16)
x <- c("Car", "Bike")
y <- matrix(1:12, ncol = 4) z
# Création de la liste
<- list(x, y, z)
lista lista
[[1]]
[1] 45 12 56 14 16
[[2]]
[1] "Car" "Bike"
[[3]]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
Nous pouvons nommer les éléments d’une liste, de la même façon que l’on nomme les éléments d’un vecteur, ce qui permet une meilleure lecture et un accès aux données parfois plus pratique.
<- list(vec_x = x, vec_y = y, mat_z = z) # méthode 1
lista names(lista) <- c("vec_x", "vec_y", "mat_z") # méthode 2
lista
$vec_x
[1] 45 12 56 14 16
$vec_y
[1] "Car" "Bike"
$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
Voici un aperçu de la structure de notre liste.
str(lista)
List of 3
$ vec_x: num [1:5] 45 12 56 14 16
$ vec_y: chr [1:2] "Car" "Bike"
$ mat_z: int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
Accéder aux éléments d’une liste
Nous pouvons accéder à un élément d’une liste de plusieurs façons différentes.
# par numéro (position), en utilisant les doubles crochets
3]]
lista[[# par nom, en utilisant les doubles crochets
"mat_z"]]
lista[[# par nom, en utilisant l'opérateur $ (Méthode la plus fréquente)
$mat_z lista
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
On peut aussi construire une sous-liste à partir d’une liste, on utilise pour cela les crochets simples.
c(1, 3)] lista[
$vec_x
[1] 45 12 56 14 16
$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
-c(1, 3)] lista[
$vec_y
[1] "Car" "Bike"
Modifier une liste
Comme pour les vecteurs, on peut modifier les éléments d’une liste existante ou en ajouter/supprimer des éléments.
1]] <- 0 # modifier 1e élément
lista[[$vec_w <- 1:10 # ajouter un nouveau élément à la liste
lista$vec_y <- NULL # supprimer vec_y de la liste
lista lista
$vec_x
[1] 0
$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
$vec_w
[1] 1 2 3 4 5 6 7 8 9 10
On peut aussi créer une liste vide et la remplir au fur et à mesure.
<- list()
listb 1]] <- c(TRUE, FALSE, FALSE)
listb[[3]] <- 1:10
listb[[$test <- TRUE
listb listb
[[1]]
[1] TRUE FALSE FALSE
[[2]]
NULL
[[3]]
[1] 1 2 3 4 5 6 7 8 9 10
$test
[1] TRUE
On peut concaténer deux ou plusieurs listes en utilisant la fonction c()
. De cette façon, les éléments des différentes listes s’enchaîneront les unes après les autres pour ne construire qu’une seule grande liste.
<- c(lista, listb)
listab listab
$vec_x
[1] 0
$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
$vec_w
[1] 1 2 3 4 5 6 7 8 9 10
[[4]]
[1] TRUE FALSE FALSE
[[5]]
NULL
[[6]]
[1] 1 2 3 4 5 6 7 8 9 10
$test
[1] TRUE
str(listab)
List of 7
$ vec_x: num 0
$ mat_z: int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
$ vec_w: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ : logi [1:3] TRUE FALSE FALSE
$ : NULL
$ : int [1:10] 1 2 3 4 5 6 7 8 9 10
$ test : logi TRUE
Et pour finir, sachez qu’une liste peut aussi contenir d’autres listes.
<- list(vet = 1:5, list1 = lista, list2 = listb)
listAB listAB
$vet
[1] 1 2 3 4 5
$list1
$list1$vec_x
[1] 0
$list1$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
$list1$vec_w
[1] 1 2 3 4 5 6 7 8 9 10
$list2
$list2[[1]]
[1] TRUE FALSE FALSE
$list2[[2]]
NULL
$list2[[3]]
[1] 1 2 3 4 5 6 7 8 9 10
$list2$test
[1] TRUE
str(listAB)
List of 3
$ vet : int [1:5] 1 2 3 4 5
$ list1:List of 3
..$ vec_x: num 0
..$ mat_z: int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
..$ vec_w: int [1:10] 1 2 3 4 5 6 7 8 9 10
$ list2:List of 4
..$ : logi [1:3] TRUE FALSE FALSE
..$ : NULL
..$ : int [1:10] 1 2 3 4 5 6 7 8 9 10
..$ test: logi TRUE
L’accès aux différents éléments d’une telle liste se fait de la même manière, comme indiqué ci-dessus. Voici quelques exemples.
$list1 listAB
$vec_x
[1] 0
$mat_z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
$vec_w
[1] 1 2 3 4 5 6 7 8 9 10
$list1$mat_z listAB
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
3]][[1]] listAB[[
[1] TRUE FALSE FALSE
3]]$test listAB[[
[1] TRUE
require(tibble)
Loading required package: tibble