Interlude de programmation : l’élégance mystérieuse des listes

Je me tourne les pouces pendant que mon code est en train de rouler dans R (1). Alors, autant vous parler de l’utilisation des listes dans ce logiciel et de ma nouvelle fonction préférée, lapply! Je vous avertis, c’est un billet plus technique, mais qui pourra peut-être intéresser des gens.

J’ai découvert récemment combien une liste peut être utile dans R. On peut y mettre des vecteurs ou des fichiers de données. En soi, la liste ne me semblait pas très utile, c’est pourquoi je ne l’avais jamais utilisée.

Mais admettons que vous voulez effectuer une même opération sur plusieurs variables ou sur plusieurs fichiers de données. Vous pouvez ranger ces variables ou ces fichiers dans une liste et effectuer en une seule ligne la même opération sur tous les éléments de la liste! Mettons ça un peu plus concret, mais pas trop (c’est un interlude, pas un cours de programmation) :

Vous voulez changer aléatoirement les valeurs d’une variable dans votre fichier de données. Mais vous voulez faire cette opération 100 fois! Et bien vous n’avez qu’à créer une liste comprenant 100 fois votre jeu de données en utilisant lapply et utiliser encore une fois la fonction pour randomiser cette colonne :

>a <- c(1, 2, 3, 4, 5)
>b <- c(45, 34, 50, 100, 64)
>test <- data.frame(a, b) #On crée un fichier avec deux colonnes a et b
>#On crée une liste qui contient 2 copies du fichier
>test2 <- lapply(1:2,function(x) test)
>test2
[[1]]
a b
1 145
2 234
3 350
4 4 100
5 564

[[2]]
a b
1 145
2 234
3 350
4 4 100
5 564
>#Et on randomize la colonne a! 
>test3 <- lapply(test2, function(df) transform(df, a = sample(a))) 
>test3
[[1]]
  a   b
1 145
2 534
3 250
4 3 100
5 464

[[2]]
  a   b
1 345
2 534
3 150
4 4 100
5 264

Je n’aurais jamais réussi la dernière partie sans de l’aide sur Stack Overflow.

Ça a l’air d’être un exemple inutile. Mais non! Ça arrive souvent qu’on veuille redistribuer aléatoirement une variable pour faire plusieurs itérations (répétitions) d’une analyse. Ça peut permettre de vérifier si les résultats sont dus à des processus aléatoires.

(1)    Pour les non-initiés, j’ai lancé une analyse. Quand les analyses sont longues, l’ordinateur ne les fait pas instantanément. C’est plate.