Mémo sur les lists
Aujourd’hui je vous propose un petit mémo sur les lists. Les lists sont un type d’objet R, comme le sont les vecteurs, les data frame, les matrices et les array.
Je me représente les lists comme des commodes à tiroir, qui contiennent des objets différents : un tiroir peut contenir un vecteur de chaines de caractères, un autre tiroir un vecteur de chiffres, et un autre tiroir un data frame (tableau de données), etc…
Longtemps, je n’ai pas trop utilisé les lists, un peu parce que je n’en avais pas besoin et sans doute aussi parce que j’avais du mal à les manipuler. Au fil du temps, j’en ai eu de plus en plus besoin et je me suis constituée un mémo pour me rappeler comment faire les principales manipulations. C’est ce mémo que je vous propose ici.
Contenu:
- 1. Initialisation / Création d’une list
- 1.1 Initilisation
- 1.2 Création d’une list
- 1.3 Nommer les éléments d’une list
- 2. Affichage d’une list
- 2.1 Afficher la structure d’une list
- 2.2 Afficher l’ensemble de la list
- 2.3 Afficher un élément spécifique
- 2.4 Afficher plusieurs éléments
- 2.5 Afficher un élément d’un élément
- 3. Manipulations d’une list
- 3.1 Supprimer un élément d’une list
- 3.2 Ajouter un élément dans une list
- 3.3 Manipuler un élément de la list :
- 3.4 Manipuler un élément d’un élément de la list :
- 3.5 Retransformer un élément de la list en vecteur :
- 4. List et data.frame
- 4.1 Créer une list à partir d’un data.frame :
- 4.2 Reformer le data.frame à partir de la list
- 4.3 Accéder à une même colonne de tous les éléments de la list :
- 4.4 Accéder à une même ligne de tous les élémentsde la list :
- 4.5 Créer une nouvelle variable pour chaque éléments de la list
- 4.6 Accéder aux noms des variables du tableau contenu dans une list
1. Initialisation / Création d’une list
1.1 Initilisation
Ici, l’initialisation d’une list vide de 3 éléments:mylist <- vector("list",3)
mylist ## [[1]] ## NULL ## ## [[2]] ## NULL ## ## [[3]] ## NULL
1.2 Création d’une list
Ici, le premier élément va contenir un vecteur de chaines de caractères, le second élément un vecteur d’entiers, et le 3ème élément les 5 premières lignes du jeu de données iris.mylist[[1]] <- c("vive", "les", "mémos") mylist[[2]] <- c(7, 8, 10, 4, 98, 56, 9) mylist[[3]] <- iris[1:5,]
1.3 Nommer les éléments d’une list : names
names(mylist) <- c("caractères", "entiers", "tableau")
mylist ## $caractères ## [1] "vive" "les" "mémos" ## ## $entiers ## [1] 7 8 10 4 98 56 9 ## ## $tableau ## 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
2 Affichage d’une list
2.1 Afficher la structure d’une list : str()
str(mylist) ## List of 3 ## $ caractères: chr [1:3] "vive" "les" "mémos" ## $ entiers : num [1:7] 7 8 10 4 98 56 9 ## $ tableau :'data.frame': 5 obs. of 5 variables: ## ..$ Sepal.Length: num [1:5] 5.1 4.9 4.7 4.6 5 ## ..$ Sepal.Width : num [1:5] 3.5 3 3.2 3.1 3.6 ## ..$ Petal.Length: num [1:5] 1.4 1.4 1.3 1.5 1.4 ## ..$ Petal.Width : num [1:5] 0.2 0.2 0.2 0.2 0.2 ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1
2.2 Afficher l’ensemble de la list : print()
print(mylist) ## $caractères ## [1] "vive" "les" "mémos" ## ## $entiers ## [1] 7 8 10 4 98 56 9 ## ## $tableau ## 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
2.3 Afficher un élement spécifique: []
Ici, l’élément 1 :print(mylist[1]) ## $caractères ## [1] "vive" "les" "mémos"
2.4 Afficher plusieurs éléments: []
Ici, les éléments 1 et 2:print(mylist[1:2]) ## $caractères ## [1] "vive" "les" "mémos" ## ## $entiers ## [1] 7 8 10 4 98 56 9
2.5 Afficher un élément d’un élément: [[]][]
Ici, le 5ème élément du 2ème élément de la list :print(mylist[[2]][5]) ## [1] 98
3. Manipulations d’une list
3.1 Supprimer un élément d’une list : NULL
mylist[3] <- NULL
print(mylist) ## $caractères ## [1] "vive" "les" "mémos" ## ## $entiers ## [1] 7 8 10 4 98 56 9
3.2 Ajouter un élément dans une list
mylist[[3]] <- c("ma", "super", "chaine", "de", "caractères")
print(mylist) ## $caractères ## [1] "vive" "les" "mémos" ## ## $entiers ## [1] 7 8 10 4 98 56 9 ## ## [[3]] ## [1] "ma" "super" "chaine" "de" "caractères"
3.3 Manipuler un élément de la list : [[]]
Ici on multiplie par 2 le vecteur de chiffres contenu dans le deuxième élément.mylist[[2]]*2 ## [1] 14 16 20 8 196 112 18
3.4 Manipuler un élément d’un élement de la list : [[]]
Ici on multiplie le troisième élément du deuxième élément de la list.mylist[[2]][3]*2 ## [1] 20
3.5 Retransformer un élement de la list en vecteur : unlist
myvec <- unlist(mylist[[2]])
myvec ## [1] 7 8 10 4 98 56 9
4. List et data.frame
4.1 Créer une list à partir d’un data.frame : split
Ici on va couper le dataframeiris
par espèce, et on va placer les
sous dataframe dans une list :
mylist <- split(iris, droplevels(iris$Species)) str(mylist) ## List of 3 ## $ setosa :'data.frame': 50 obs. of 5 variables: ## ..$ Sepal.Length: num [1:50] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## ..$ Sepal.Width : num [1:50] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## ..$ Petal.Length: num [1:50] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## ..$ Petal.Width : num [1:50] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... ## $ versicolor:'data.frame': 50 obs. of 5 variables: ## ..$ Sepal.Length: num [1:50] 7 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 ... ## ..$ Sepal.Width : num [1:50] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 ... ## ..$ Petal.Length: num [1:50] 4.7 4.5 4.9 4 4.6 4.5 4.7 3.3 4.6 3.9 ... ## ..$ Petal.Width : num [1:50] 1.4 1.5 1.5 1.3 1.5 1.3 1.6 1 1.3 1.4 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 2 2 2 2 2 2 2 2 2 2 ... ## $ virginica :'data.frame': 50 obs. of 5 variables: ## ..$ Sepal.Length: num [1:50] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 ... ## ..$ Sepal.Width : num [1:50] 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.6 ... ## ..$ Petal.Length: num [1:50] 6 5.1 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 ... ## ..$ Petal.Width : num [1:50] 2.5 1.9 2.1 1.8 2.2 2.1 1.7 1.8 1.8 2.5 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 3 3 3 3 3 3 3 3 3 3 ...Je préfère ajouter
droplevels
car si une modalité de Species
a été supprimée dans des manipulations antérieures cette modalité n’apparaît plus dans les sorties de la fonction str
par exemple.
4.2 Reformer le data.frame à partir de la list :
mydf <- data.frame ( Reduce (rbind , mylist) )
str(mydf) ## 'data.frame': 150 obs. of 5 variables: ## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
4.3 Accéder à une même colonne de tous les élements de la list : “[“
Ici la seconde colonne :lapply(mylist,"[", , 2) ## $setosa ## [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 ## [18] 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 ## [35] 3.1 3.2 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 ## ## $versicolor ## [1] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 ## [18] 2.7 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 ## [35] 3.0 3.4 3.1 2.3 3.0 2.5 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 ## ## $virginica ## [1] 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 ## [18] 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 ## [35] 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 3.3 3.0 2.5 3.0 3.4 3.0On peut aussi nommer la variable.
lapply(mylist,"[", , "Sepal.Width") ## $setosa ## [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 ## [18] 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 ## [35] 3.1 3.2 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 ## ## $versicolor ## [1] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 ## [18] 2.7 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 ## [35] 3.0 3.4 3.1 2.3 3.0 2.5 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 ## ## $virginica ## [1] 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 ## [18] 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 ## [35] 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 3.3 3.0 2.5 3.0 3.4 3.0
4.4 Accéder à une même ligne de tous les éléments de la list : “[“
Ici la ligne 5:lapply(mylist,"[", 5,) ## $setosa ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 5 5 3.6 1.4 0.2 setosa ## ## $versicolor ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 55 6.5 2.8 4.6 1.5 versicolor ## ## $virginica ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 105 6.5 3 5.8 2.2 virginica
4.5 Créer une nouvelle variable pour chaque élements de la list
Ici on cré une nouvelle variable Date, fixée à 2018.mylist2 <- lapply(mylist, function(x){ x$year<- 2018 return(x) }) str(mylist2) ## List of 3 ## $ setosa :'data.frame': 50 obs. of 6 variables: ## ..$ Sepal.Length: num [1:50] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## ..$ Sepal.Width : num [1:50] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## ..$ Petal.Length: num [1:50] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## ..$ Petal.Width : num [1:50] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... ## ..$ year : num [1:50] 2018 2018 2018 2018 2018 ... ## $ versicolor:'data.frame': 50 obs. of 6 variables: ## ..$ Sepal.Length: num [1:50] 7 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 ... ## ..$ Sepal.Width : num [1:50] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 ... ## ..$ Petal.Length: num [1:50] 4.7 4.5 4.9 4 4.6 4.5 4.7 3.3 4.6 3.9 ... ## ..$ Petal.Width : num [1:50] 1.4 1.5 1.5 1.3 1.5 1.3 1.6 1 1.3 1.4 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 2 2 2 2 2 2 2 2 2 2 ... ## ..$ year : num [1:50] 2018 2018 2018 2018 2018 ... ## $ virginica :'data.frame': 50 obs. of 6 variables: ## ..$ Sepal.Length: num [1:50] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 ... ## ..$ Sepal.Width : num [1:50] 3.3 2.7 3 2.9 3 3 2.5 2.9 2.5 3.6 ... ## ..$ Petal.Length: num [1:50] 6 5.1 5.9 5.6 5.8 6.6 4.5 6.3 5.8 6.1 ... ## ..$ Petal.Width : num [1:50] 2.5 1.9 2.1 1.8 2.2 2.1 1.7 1.8 1.8 2.5 ... ## ..$ Species : Factor w/ 3 levels "setosa","versicolor",..: 3 3 3 3 3 3 3 3 3 3 ... ## ..$ year : num [1:50] 2018 2018 2018 2018 2018 ...Ou encore, en utilisant deux autres variables, et en utilisant une autre façon de nommer la nouvelle variable.
mylist2 <- lapply(mylist, function(x){ x["NewVar"] <- x$Sepal.Length + x$Sepal.Width return(x) }) mylist2[[1]][1:10,] ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species NewVar ## 1 5.1 3.5 1.4 0.2 setosa 8.6 ## 2 4.9 3.0 1.4 0.2 setosa 7.9 ## 3 4.7 3.2 1.3 0.2 setosa 7.9 ## 4 4.6 3.1 1.5 0.2 setosa 7.7 ## 5 5.0 3.6 1.4 0.2 setosa 8.6 ## 6 5.4 3.9 1.7 0.4 setosa 9.3 ## 7 4.6 3.4 1.4 0.3 setosa 8.0 ## 8 5.0 3.4 1.5 0.2 setosa 8.4 ## 9 4.4 2.9 1.4 0.2 setosa 7.3 ## 10 4.9 3.1 1.5 0.1 setosa 8.0On peut également utiliser la fonction
map
du package purrr
:
library(purrr) mylist3 <- map(mylist, function(x){ x$year<- 2018 return(x) })
4.6 Accéder aux nom des variables du tableau contenu dans une list
names(mylist3[[1]]) ## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" ## [5] "Species" "year"