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.
Table des matières
Initialisation - création d'une liste
Initialisation
Ici, l’initialisation d’une list vide de 3 éléments :
mylist <- vector("list",3)
mylist
## [[1]]
## NULL
##
## [[2]]
## NULL
##
## [[3]]
## NULL
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,]
Nommer les éléments d'une list
mylist[[1]] <- c("vive", "les", "mémos")
mylist[[2]] <- c(7, 8, 10, 4, 98, 56, 9)
mylist[[3]] <- iris[1:5,]
Nommer les éléments d'une liste : 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
Affichage d'une list
Afficher la structure d'une liste : 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
Afficher l'ensemble de la liste : 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
Afficher un élement spécifique: []
Ici, l’élément 1 :
print(mylist[1])
## $caractères
## [1] "vive" "les" "mémos"
Afficher plusieurs élements
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
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
Manipulation d'une list
Supprimer un élement d'un liste : NULL
mylist[3] <- NULL
print(mylist)
## $caractères
## [1] "vive" "les" "mémos"
##
## $entiers
## [1] 7 8 10 4 98 56 9
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"
Manipuler un élément de la liste : [[]]
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
Manipuler un élément d'un élément 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
Retransformer un élément de la list en vecteur : unlist
myvec <- unlist(mylist[[2]])
myvec
## [1] 7 8 10 4 98 56 9
List et data.frame
Créer une list à partir d'un data.frame : split
Ici on va couper le dataframe iris
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.
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 .
Accéder à un emême colonne de tous les éléments 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.0
On 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
Accéder à une même ligne de tous les éléments de la liste : "["
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
Créer une nouvelle variable pour chaque élément de a 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.0
On peut également utiliser la fonction map
du package purrr
:
library(purrr)
mylist3 <- map(mylist, function(x){
x$year<- 2018
return(x)
})
Accéder aux noms des variables du tableau contenu dans une list
names(mylist3[[1]])
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
## [5] "Species" "year"
Pour finir
Vous pensez qu’il manque quelque chose ? Si oui indiquez le moi en commentaire, et je le partagerai.
En attendant, j’espère que ce petit mémo permettra au plus grand nombre, et notamment aux débutants, de manipuler les lists plus facilement.
Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee. Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee
Crédit photo : Geralt
Comment filtrer une liste ? Ma liste contient des dataframes même nombre de colonnes mais nombre de lignes différents. Je voudrais récupérer tous les éléments de la liste qui ont un certains nombre de lignes
Merci pour vos tutos
Bonjour Christelle,
je ne sais pas précisément, mais je vous conseille de regrader du côté des fonctions map() du package purrr.
Bien à vous.