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

Poursuivez votre lecture

2 réponses

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

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

Laisser un commentaire

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