Tutoriel : Comment importer plusieurs jeux de données automatiquement

Il y a quelques années, j’ai fait une prestation qui consistait à analyser des données de températures mesurées le long d’une rivière. Cette analyse nécessitait d’importer plusieurs jeux de données dans R, une bonne vingtaine ! Il y avait des fichiers pour chaque lieu de prélèvement, pour chaque année étudiée, et des fichiers de débits, de précipitations ou encore de températures atmosphériques.Comme c’était la première fois que j’étais confrontée à cette situation de devoir importer plusieurs jeux de données, j’ai commencé à les importer “manuellement”, un par un.Et puis le client s’est rendu compte que certains fichiers contenaient des erreurs. Il les a donc corrigé, ou fait corriger, et pendant cette phase de validation les noms de certains fichiers ont un peu évolué.Comme nous étions pressés, le client me renvoyait les fichiers corrigés dés qu’ils étaient disponibles. Au final, je refaisais l’importation des 20 jeux de données quasiment tous les jours, en modifiant à chaque fois mes lignes de commandes pour m’adapter aux modifications des noms.C’est donc à cette occasion que je me suis posée cette question : comment importer plusieurs jeux de données, de façon automatisée, dans R? Et accessoirement consacrer mon temps à des tâches plus intéressantes !J’ai rapidement pu mettre en place une procédure, que je vais vous expliquer, en pas à pas, dans ce post. Elle se déroule en  4 étapes :
  1. Placez les fichiers de données dans un dossier spécifique.
  2. Récupérez automatiquement la liste des noms des fichiers présents (avec leur extension, “.csv”, par exemple)
  3. Créez une liste des noms des données à partir des noms des fichiers (en supprimant la partie extension)
  4. Importez chaque fichier grâce à la liste des noms des fichiers, et en lui donnant le nom adéquat grâce à la liste des noms des données.
Il faut faire une distinction entre d’une part les noms des fichiers de données qui contiennent l’extension .csv. Et d’autre part, les noms des jeux de données, qui ne doivent pas contenir cette extension, et qui en pratique correspondent aux données à proprement parlé.Pour ceux qui sont pressés, le code est là :
library(here)

files_names <- list.files(here("data"))
nb_files <- length(files_names)
data_names <- vector("list",length=nb_files)

for (i in 1 : nb_files) {
        data_names[i] <- strsplit(files_names[i], split=".csv")
    }

for (i in 1:nb_files) {
      assign(data_names[[i]], 
      read.csv2(paste(here("data", files_names[i])))
      )}
Pour les autres, je détaille les étapes en pas à pas, dessous !

1. Organisez votre travail sous la forme d’un projet R.

Avant de parler de la procédure en elle-même, je vous conseille d’organiser votre travail sous la forme d’un projet R. Si vous ne savez pas ce que c’est, allez voir mon article Importer facilement vos données dans le logiciel R  , et plus particulièrement la section Organisez votre espace de travail sous la forme d’un projet R.Ensuite, créez un dossier data dans votre working directory. Pour cela, utilisez l’outil New Folder de R studio, qui se trouve dans la fenêtre en bas à droite.création dossier R studiocréation dossier dans R StudioPlacez y tous les fichiers de données que vous souhaitez importer. Comme expliqué dans mon article 12 conseils pour organiser efficacement vos données dans un tableur, utilisez préférentiellement un format .csv. Ce format ne dépendant pas d’un logiciel, il peut être lu par n’importe lequel.Pour illustrer cet article, j’ai créé un dossier “data“, dans lequel j’ai simplement placés 10 jeux de données au format csv.importation de plusieurs fichiers dans R

2. Récupérez les noms des fichiers de données grâce à la fonction “list.files

Si les jeux de données ne sont pas directement stockés dans le working directory (c’est le cas ici puisqu’ils ont été placés dans le dossier “data” du working directory), la fonction list.files a besoin qu’on lui précise le chemin d’accès vers le dossier data à l’aide de l’argument path.La fonction here() du package here est utilisée pour construire ce chemin d’accès.Ainsi, si j’utilise la commande here("data") j’obtiens en sortie le chemin d’accés du dossier “data” de mon working directory :La commande complète donne :
files_names <- list.files(path=here("data"))
files_names

##  [1] "AirPassengers.csv"    "BJsales.csv"          "BOD.csv"             
##  [4] "CO2.csv"              "Formaldehyde.csv"     "HairEyeColor.csv"    
##  [7] "InsectSprays.csv"     "JohnsonJohnson.csv"   "LakeHuron.csv"       
## [10] "LifeCycleSavings.csv"
Comme vous pouvez le voir, la fonction file_list renvoie un vecteur de chaines de caractères qui contiennent l’extension .csv. On va alors supprimer cette partie pour générer les noms des jeux de données

3. Créez la liste des noms des jeux de données

Pour cela, on va couper les noms des fichiers, en utilisant la fonction strsplit, et en indiquant dans l’argument split où couper. Voici comment ça fonctionne avec le premier jeu de données par exemple :
file1 <- files_names[1]
file1

## [1] "AirPassengers.csv"

name1 <- strsplit(file1, split=".csv")
name1

## [[1]]
## [1] "AirPassengers"
Les doubles crochets nous montrent que la fonction strsplit ne renvoie pas un vecteur mais un un objet de type list, c’est important pour la suite !A présent, ce qu’on souhaite c’est reproduire la même procédure avec tous les fichiers de données. Pour cela, on peut utiliser une boucle for par exemple.On commence alors par récupérer le nombre de fichiers à importer, en utilisant la commande length(files_names).
nb_files <- length(files_names)
Ensuite, on crée (on peut dire initialiser) un objet de type liste, vide, pour recevoir les sorties de la fonction strsplit, autrement dit pour stocker les noms des jeux de données, c’est à dire, les chaines de caractères tronquées. Pour plus d’infos sur les objet de type liste, je vous recommandes le livre R for DataScience de Garrett Grolemund et Hadley Wickham, qui est consultable ici.
data_names <- vector("list",length=nb_files)
data_names

## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
## NULL
## 
## [[4]]
## NULL
## 
## [[5]]
## NULL
## 
## [[6]]
## NULL
## 
## [[7]]
## NULL
## 
## [[8]]
## NULL
## 
## [[9]]
## NULL
## 
## [[10]]
## NULL
Et enfin on utilise la boucle for pour récupérer successivement les noms de tous les jeux de données.
for (i in 1 : nb_files)
    {
        data_names[i] <- strsplit(files_names[i], split=".csv")
    }

data_names

## [[1]]
## [1] "AirPassengers"
## 
## [[2]]
## [1] "BJsales"
## 
## [[3]]
## [1] "BOD"
## 
## [[4]]
## [1] "CO2"
## 
## [[5]]
## [1] "Formaldehyde"
## 
## [[6]]
## [1] "HairEyeColor"
## 
## [[7]]
## [1] "InsectSprays"
## 
## [[8]]
## [1] "JohnsonJohnson"
## 
## [[9]]
## [1] "LakeHuron"
## 
## [[10]]
## [1] "LifeCycleSavings"

4.Importer les jeux de données et les nommer correctement

Pour cette dernière étape, on utilise une fonction souvent méconnue, la fonction assign. Cette fonction est très pratique car elle permet d’assigner ou d’attribuer un nom à un objet.Le principe va donc être d’importer les jeux de données en utilisant la fonction read.csv2, et de leur assigner les noms correspondant. On le fait successivement pour chacun de jeu de données, à l’aide d’une boucle for.
for (i in 1:nb_files) {
assign(data_names[[i]],
read.csv2(paste (here("data", files_names[i]))))
}
 Comme précédemment, la commande paste(here("data", files_names[i])sert simplement à former le chemin d’accès. C’est en quelque sort un raccourci pour écrire “C:/<Users/clair/Documents/MesAnalysesStats/Temperature_Riviere/data/LifeCycleSavings.csv”.On utilise des double crochets pour data_names car on souhaite avoir accès au contenu de l’élément de cette liste. Vous pouvez voir la différence entre les simples et les doubles crochets ici :
data_names[1]

## [[1]]
## [1] "AirPassengers"

data_names[[1]]

## [1] "AirPassengers"
 A la fin de l’exécution de la boucle, on peut voir que les jeux de données ont été chargés dans le workspace.
importation de plusieurs fichiers dans R
En résumé, mises bout à bout les ligne de commandes sont :
library(here)

files_names <- list.files(here("data"))
nb_files <- length(files_names)
data_names <- vector("list",length=nb_files)

for (i in 1 : nb_files) {
        data_names[i] <- strsplit(files_names[i], split=".csv")
}

for (i in 1:nb_files) {
      assign(data_names[[i]], 
      read.csv2(paste(here("data", files_names[i]))))
}
Et si vos jeux de données possèdent les mêmes variables, par exemple parce qu’il s’agit des mêmes informations mesurées à des temps ou dans des lieux différents, et que vous voulez les “empiler” pour ne faire qu’u seul jeu de données complet, vous pouvez utiliser les lignes suivantes :
#on stock tous les data dans une liste
dataset_list <- vector("list",length=nb_files)

for (i in 1:nb_files) {
    dataset_list[[i]] <- get(data_names[[i]])
        }

# on empile les jeux de données 
complete_data <- dataset_list[[1]]
    for (i in 2:nb_files){
    complete_data <- rbind(complete_data, dataset_list[[i]])
    }
J’espère que cet article permettra au débutants de bien comprendre comment importer plusieurs jeux de données de manière automatisée.Si vous êtes un utilisateur confirmé de R et que vous avez d’autres procédures, indiquez les moi en commentaire.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 : geralts.Poursuivez votre lecture  

8 réponses

  1. Bonjour,
    Merci beaucoup pour ce type de pas à pas détaillé qui sauvent les mal comprenant comme moi. Quatre remarques /questions :
    1 – La boucle “for” pour strsplit semble inutile, la fonction se tire bien d’un vecteur :

    for (i in 1 : nb_files) {
    data_names[i] <- strsplit(files_names[i], split=".csv")
    }
    remplacé par
    data_names[i] <- strsplit(files_names[i], split=".csv")

    2 – si on a un melange de fichiers csv et txt (avec les mêmes separateurs) on peut passer "plusieurs couches" :

    data_names<-strsplit(files_names, split=".csv")
    data_names<-unlist(data_names)
    data_names<-strsplit(data_names, split=".txt")

    3- il est utile de pouvoir réintégrer les noms de jeux de données dans une nouvelle variable (quand ils correspondent à des lieux différents par exemples) avant de mettre les tableaux bout à bout :

    for (i in 1:nb_files) {
    nvelle_variable<-as.factor(rep(data_names[[i]], nrow(dataset_list[[i]])))
    dataset_list[[i]]<-mutate(dataset_list[[i]], nvelle_variable)
    }

    4- Une question : cette démarche produit beaucoupe de variable intermédiaire. Est-il pertinent de rechercher un moyen de les "virer" à la fin de script ? Y a-t-il un moyen élégant de le faire ?

  2. Bonjour Bertrand,

    Pour retirer certaines variables de l’environnement R, on peut utiliser la fonction rm().
    (rm pour remove).
    Par exemple, on peut écrire rm(i) pour retirer la variable i.

    J’ai l’habitude de commencer un script par rm( list=ls() ) pour retirer toutes les variables.

  3. bonjour,
    comment faire une fois compiler , pour stipuler leur source c’est à dire si savoir si l’information provient de la table A ou B

  4. Bonjour, J’ai 88 tableaux donc très utile merci! Ces tableaux étaient classés en dossier par année (29 à 30 par année). POur la première année tout s’est bien passée par contre pour les deux suivante R m’affiche une erreur lorsque j’ai voulu empilé les données:
    Erreur dans match.names(clabs, names(xi)) :
    les noms ne correspondent pas aux noms précédents
    késako?
    Merci!

    1. Bonjour,

      Cette erreur est généralement due à une différence entre les noms de colonnes des tableaux que vous essayez de fusionner (empiler) ensemble. Il est possible que les noms de colonnes dans les premiers tableaux ne correspondent pas exactement aux noms de colonnes dans les tableaux des années suivantes.
      Pour vérifier que les noms de colonnes sont identiques dans tous les tableaux, vous pouvez utiliser la fonction names(), par ex : names(tab1), et names(tab2) Vous pouvez aussi utiliser names(tab1)==names(tab2), R renverra TRUE ou FALSE
      Si les noms de colonnes sont différents, vous pouvez les renommer en utilisant la fonction names(), par exemple names(tab2) <- names(tab1).Sinon, il y a aussi un article plus récent qui pourrait également vous aider : https://delladata.fr/importer-plusieurs-fichiers/

      Bonne continuation.

  5. Bonjour,
    Merci pour votre aide j’ai pu ouvrir mes fichiers d’un seul coup. Le problème c’est que je n’arrive pas à lire les données dans mes fichier excel. Par exemple, je cherche à définir une nouvelle variable x pour quelle me sélectionne uniquement la colonne désiré. Exemple : data_names[1]$X.CPtotal. Il m’affiche que c’est NULL alors que j’ai 2048 valeurs dans la colonne. Comment puis-je faire pour avoir l’ensemble de ces valeurs ?

    1. Bonjour,

      je ne suis pas certaine de comprendre votre question, mais comme il s’agit de liste, il faut sans doute utiliser les doubles crochets [[]].
      Bonne continuation

  6. Merci beaucoup Bertrand pour ce partage !

    Cependant, j’aimerai savoir comment je peux “Importer plusieurs Classeurs Excel (chacun contenant une seule feuille du même nom) et les combiner dans un seul tableau” ?
    J’ai vu votre autre article mais là-bas il s’agit d’Importer plusieurs feuilles (d’un même Classeur) Excel et les combiner dans un seul tableau.

    Je vous remercie d’avance !

Laisser un commentaire

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

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.