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 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.

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.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

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.0
On 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"

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 🙏 👉 Cliquez ici pour soutenir le blog Statistiques et Logiciel R Crédits photos : Geralt Retrouvez ici 3 de mes articles les plus consultés: 12 conseils pour organiser efficacement vos données dans un tableur Comment insérer des références bibliographiques dans un document Rmarkdown ? Comment retrouver sous R une couleur employée avec Excel ?

Une réponse

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *