Importer des données

Importer des données dans R

11.0.1 Formats de fichiers

Il existe de nombreux formats de fichiers pour les données rectangulaires (données organisées en colonnes et en lignes). Ces données sont aussi appelées flat files (fichiers plats), car elles sont plates au sens où elles n'ont que deux dimensions (lignes et colonnes). Certaines applications (SPSS, SAS, STATA, Excel, Numbers, etc.) utilisent des formats de fichiers spécifiques qui ne peuvent pas être lus par d'autres applications. Cela peut poser problème lors du transfert de données d'une application à l'autre. Pour éviter ce type de difficulté, on peut utiliser un format de fichier universel, c'est-à-dire un format utilisable par tous les logiciels sur tous les ordinateurs. Le format de fichier le plus universel est le DSV, pour Delimiter Separated Values, ou en français valeurs séparées par un délimiteur.

Dans ces fichiers, les valeurs sont délimitées par un séparateur. Le tableau ci-dessous présente différents formats DSV. La seule différence entre ces formats est le séparateur. En principe, n'importe quel caractère peut servir de séparateur. Le séparateur le plus courant est la virgule (,), et ce type de fichier est appelé CSV (Comma Separated Values).

Type de fichier Séparateur, nom Séparateur, caractère
CSV (Comma Separated Values) Virgule ,
TSV (Tab Separated Values) tabulation
CSV (Colon Separated Values Deux-points ;

Types de fichiers et séparateurs.

Les fichiers DSV sont tout simplement des fichiers texte dans lesquels les valeurs (les colonnes) sont délimitées par un séparateur. Chaque ligne d'un fichier DSV correspond à une observation. Voici à quoi ressemble un fichier CSV :

date, patient, diagnosis
25 May, Adam, Diabetes
25 May, Uma, Rheumatoid arthritis
15 July, Robin, Heart disease

Au premier abord, le fichier semble désorganisé, car il n'y a pas de colonnes visibles, mais il s'agit en réalité d'une manière tout à fait satisfaisante de stocker des données, et le fichier peut de surcroît être utilisé par toutes les applications.

Nous pouvons lire le fichier CSV ci-dessus directement dans R à l'aide de la fonction [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), qui se trouve dans le package readr. N'oubliez pas d'installer le package readr (install.packages("readr")) si vous ne l'avez pas.

## Activer le package readr
library(readr)

## Lire des données au format CSV directement dans R
mina_data <- read_csv("date, patient, diagnosis
                      25 May, Adam, Diabetes
                      25 May, Uma, Rheumatoid arthritis
                      15 July, Robin, Heart disease")

## Afficher notre data frame
mina_data
## A tibble: 3 × 3
  date    patient diagnosis
  <chr>   <chr>   <chr>
1 25 May  Adam    Diabetes
2 25 May  Uma     Rheumatoid arthritis
3 15 July Robin   Heart disease

Comme on le voit ci-dessus, chaque ligne d'un fichier DSV correspond à une ligne d'un tableau à deux dimensions. Notez également que la première ligne contient les noms des colonnes.

Les délimiteurs les plus courants pour les fichiers DSV sont la virgule (,), la tabulation (\t) et le point-virgule (;).

Toutes les applications de statistique et de data science peuvent importer et exporter des fichiers DSV. Le DSV est donc une méthode simple et sûre pour stocker et transférer des données. Un inconvénient des fichiers DSV est qu'ils ne conservent pas les métadonnées des variables. Dans plusieurs des applications les plus populaires, il est possible de créer des métadonnées pour les variables. Les métadonnées comprennent notamment :

  1. Type de variable : dans Excel, SAS, SPSS, etc., une colonne peut être définie comme numérique, entière, date, etc.
  2. Label de la variable : un label (étiquette) est une version lisible du nom de la variable, adaptée à l'affichage. Par exemple, la variable “sysblodtrck” peut recevoir le label ”Pression artérielle systolique”.
  3. Labels des modalités des variables catégorielles : les valeurs des variables catégorielles sont souvent enregistrées sous forme de chiffres dans Excel, SPSS, SAS, etc. Par exemple, la variable “sexe” peut prendre les valeurs 0 et 1, où 0 correspond à Homme et 1 à femme. Dans la plupart des logiciels, ces modalités peuvent aussi recevoir un label lisible.

Les informations des points 1, 2 et 3 sont perdues lors de l'export au format DSV. Ce n'est pas un problème majeur pour le premier point (perte du type de variable), car R est remarquablement doué pour deviner le type des variables lors de l'importation des données et vous pouvez en outre convertir vous-même les types de variables (voir le chapitre précédent). Pour les points 2 et 3, la perte des métadonnées peut être plus gênante, car il peut être nécessaire de refaire ce travail manuellement.

11.1 Working directory (wd) : votre répertoire de travail

Votre working directory est votre répertoire ou espace de travail. C'est l'emplacement (le plus souvent un dossier) où R cherche d'abord les fichiers et où R enregistre les fichiers, à moins que vous ne demandiez expressément un autre emplacement. Les principes suivants peuvent être recommandés :

  • Pour chaque étude/rapport/analyse que vous réalisez dans R, vous devriez créer un nouveau Projet (Figure 11.1).
  • Lorsque vous créez un nouveau Projet, vous pourrez créer un nouveau dossier dans lequel le projet est hébergé.
  • Un fichier portant l'extension .rproj est enregistré dans ce dossier. Lorsque vous voulez travailler sur le projet, il vous suffit de cliquer sur ce fichier pour démarrer R (Figure 11.2).
  • Placez tous vos fichiers (Excel, SPSS, SAS, CSV, etc.) dans ce dossier.
Figure 11.1 : Créer un nouveau Projet dans R.
Figure 11.1 : Créer un nouveau Projet dans R.
Figure 11.2 : Un fichier de projet RStudio porte l'extension .Rproj. Lorsqu'on l'ouvre, R démarre avec le bon working directory et les paramètres enregistrés lors de la session précédente.
Figure 11.2 : Un fichier de projet RStudio porte l'extension .Rproj. Lorsqu'on l'ouvre, R démarre avec le bon working directory et les paramètres enregistrés lors de la session précédente.

Si ce principe est respecté, il est très simple de lire des fichiers dans R et d'écrire des fichiers depuis R vers l'ordinateur.

Vous pouvez vérifier quel est votre working directory avec la fonction getwd() :

getwd()
[1] "/Users/Adam/Desktop/DataScienceBook"

Si vous travaillez dans un Projet, vous ne devriez pas changer de working directory. Si vous ne travaillez pas dans un Projet, vous pouvez changer de working directory avec la fonction [setwd()](https://rdrr.io/r/base/getwd.html). Nous changeons maintenant le working directory pour le dossier MyProject situé sur le Bureau.

setwd("/Users/Adam/Desktop/MyProject")

Le chemin d'accès au dossier sur le Bureau peut être différent sur votre ordinateur.

11.2 Importer des fichiers depuis l'ordinateur

Nous allons maintenant importer des fichiers depuis l'ordinateur local (celui sur lequel nous travaillons) à l'aide des packages readr et readxl. Le package readr sert pour plusieurs types de fichiers et readxl pour les fichiers Excel.

install.packages("readr")
install.packages("reaxl")

Activez les packages :

library(readxl)
library(readr)

En fait, ces deux packages font partie du méta-package tidyverse, ce qui signifie qu'il suffit d'installer tidyverse et d'activer le package. Ci-dessous, la ligne d'installation a été mise en commentaire, car le package est déjà installé sur cet ordinateur.

install.packages("tidyverse")
library(tidyverse)

Le tidyverse est tout un écosystème de packages très puissants. Les créateurs du tidyverse ont estimé que des ajustements de l'objet data frame de R étaient nécessaires pour qu'il fonctionne mieux avec les packages du tidyverse. Ils ont donc créé une variante du data frame appelée tibble. Les packages readr et readxl créent des data frames de type tibble !

Le package readr contient les fonctions suivantes pour importer des données :

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) pour lire des fichiers CSV utilisant la virgule (,) comme séparateur. Dans ces fichiers, le point (.) sert de séparateur décimal pour les valeurs numériques.
  • [read_csv2()](https://readr.tidyverse.org/reference/read_delim.html) pour lire des fichiers CSV utilisant le point-virgule (;) comme séparateur. Dans ces fichiers, la virgule (,) sert de séparateur décimal pour les valeurs numériques.
  • [read_tsv()](https://readr.tidyverse.org/reference/read_delim.html) lit les tab separated files (fichiers séparés par des tabulations)
  • [read_fwf()](https://readr.tidyverse.org/reference/read_fwf.html) lit les fixed-width files (fichiers à largeur fixe)
  • [read_log()](https://readr.tidyverse.org/reference/read_log.html) lit les web log files (fichiers journaux web)
  • [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) fonction universelle capable de lire tous les types de fichiers DSV, le séparateur devant être spécifié explicitement.

Ces fonctions utilisent la même syntaxe, ce qui signifie qu'il suffit d'apprendre une fonction pour pouvoir utiliser les autres.

Voici un fichier CSV adapté à une importation avec read_csv() :

name, bloodvalue,
Adam, 90.5,
Janet, 80.1,

Voici un fichier CSV adapté à une importation avec read_csv2() :

name; bloodvalue;
Adam; 90,5;
Janet; 80,1;

Pour obtenir de l'aide sur read_csv(), écrivez un point d'interrogation devant le nom de la fonction :

?read_csv

L'aide s'affiche alors pour toutes les fonctions du package readr, et la documentation commence par read_delim(), qui est la fonction universelle :

Fenêtre d'aide de RStudio affichant la documentation de readr pour read_delim, avec la description et la liste des arguments sous Usage

Sous la rubrique Usage de [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), on trouve ce qui suit :

read_csv(
  file,
  col_names = TRUE,
  col_types = NULL,
  col_select = NULL,
  id = NULL,
  locale = default_locale(),
  na = c("", "NA"),
  quoted_na = TRUE,
  quote = "\"",
  comment = "",
  trim_ws = TRUE,
  skip = 0,
  n_max = Inf,
  guess_max = min(1000, n_max),
  name_repair = "unique",
  num_threads = readr_threads(),
  progress = show_progress(),
  show_col_types = should_show_types(),
  skip_empty_rows = TRUE,
  lazy = should_read_lazy()
)

Le premier argument est file, c'est-à-dire le chemin d'accès au fichier et le nom du fichier. Si le fichier que vous voulez importer se trouve dans votre working directory, il suffit d'écrire le nom du fichier. Si le fichier ne se trouve pas dans votre working directory, vous devez indiquer le chemin complet du fichier.

Considérons l'arborescence de dossiers suivante. Tout en haut se trouve le dossier Studie1, qui contient le fichier data1.csv et le dossier Projektet. Le dossier R-Projekt est notre working directory ; il contient les fichiers Studie1.rproj, Script.R et data2.csv, ainsi que le dossier Enkäter, qui contient à son tour data3.csv.

Studie1
│   data1.csv
│
└───Projektet (working directory)
    │   Studie1.rproj
    │   Script.R
    |   data2.csv
    |
    └───Enkäter
    |   data3.csv

Exemple 1 : importer data2.csv, qui se trouve dans notre working directory :

mina_data <- read_csv(file="data2.csv")

Exemple 2 : importer data3.csv, qui se trouve dans le dossier Enkäter du working directory :

mina_data <- read_csv(file="Enkäter/data3.csv")

Exemple 3 : importer data1.csv, qui se trouve un niveau au-dessus du working directory. Pour désigner à R un dossier situé plus haut, on utilise deux points (..), comme suit :

mina_data <- read_csv(file="../data1.csv")

R part donc de votre working directory pour trouver les fichiers. Si vous ne voulez pas partir de votre working directory, vous devez indiquer le chemin complet du fichier ainsi que le nom du fichier.

Plusieurs points sont à noter ici :

  1. La fonction [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) possède de nombreux arguments (file, col_names, col_types, col_select, etc.). Malgré cela, nous n'avons indiqué qu'un seul argument (file) ci-dessus. Cela signifie que la fonction a accepté que nous ne spécifiions pas tous les arguments. Les arguments que nous n'avons pas spécifiés prennent leurs valeurs par défaut. La valeur par défaut est indiquée dans l'aide (voir ci-dessus).
  2. Dans l'aide, sous Usage, on voit que la valeur par défaut de col_names est TRUE, ce qui signifie que R utilise la première ligne comme noms de colonnes.

Dans la fonction [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), file et col_names sont les deux premiers arguments. Nous les indiquons dans la commande ci-dessous :

mina_data <- read_csv(file="data.csv", col_names = TRUE)

Comme ce sont les premiers arguments, nous pouvons en fait omettre le nom des arguments et spécifier directement les valeurs :

mina_data <- read_csv("data.csv", TRUE)

On peut donc se passer de nommer les arguments, mais les valeurs doivent alors être indiquées exactement dans le même ordre que les arguments.

Nous lisons maintenant des données directement depuis le script avec [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), puis nous affichons le résultat :

mina_data <- read_csv("name, bloodvalue, sex, education
                      Adam, 90.5, male, 1
                      Janet, 80.1, female, 2")

## Afficher le résultat
mina_data
## A tibble: 2 × 4
  name  bloodvalue sex    education
  <chr>      <dbl> <chr>      <dbl>
1 Adam        90.5 male           1
2 Janet       80.1 female         2

Notez ce qui suit :

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) a utilisé la première ligne comme noms de colonnes.
  • Les colonnes name et sex ont été classées comme <chr>, ce qui signifie character.
  • bloodvalue est un <dbl>, ce qui signifie double.
  • La colonne education est classée comme <int>, c'est-à-dire integer. Les valeurs numériques sans entiers sont classées comme integers.

Si la première ligne ne contient pas les noms des colonnes, on utilise l'argument col_names=FALSE. Les colonnes reçoivent alors les noms X1, X2, X3, …, Xn.

read_csv("Adam, 90.5, male, 1
         Janet, 80.1, female, 2",
         col_names=FALSE)
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): X1, X3
dbl (2): X2, X4

## A tibble: 2 × 4
  X1       X2 X3        X4
  <chr> <dbl> <chr>  <dbl>
1 Adam   90.5 male       1
2 Janet  80.1 female     2

Vous pouvez spécifier directement les noms des colonnes si vous le souhaitez :

mina_data &lt;- read_csv("Adam, 90.5, male, 1
                      Janet, 80.1, female, 2",
                      col_names=c("Namn", "Blodvärde", "Kön", "Utbildning"))
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodvärde, Utbildning
mina_data
## A tibble: 2 × 4
  Namn  Blodvärde Kön    Utbildning
  <chr>     <dbl> <chr>       <dbl>
1 Adam       90.5 male            1
2 Janet      80.1 female          2

11.2.1 Indiquer les valeurs manquantes

La plupart des langages de programmation utilisent un symbole pour les données manquantes. Les données manquantes doivent toujours être spécifiées explicitement. R utilise le symbole NA (Not Available) pour indiquer qu'une valeur est manquante. Relisons les mêmes données, mais en omettant la pression artérielle d'Adam :

mina_data <- read_csv("Namn, Blodtryck, Kön, Utbildning
                      Adam, , male, 1
                      Janet, 80.1, female, 2")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodtryck, Utbildning
mina_data
## A tibble: 2 × 4
  Namn  Blodtryck Kön    Utbildning
  <chr>     <dbl> <chr>       <dbl>
1 Adam       NA   male            1
2 Janet      80.1 female          2

La fonction [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) constate qu'une valeur est manquante et l'indique comme NA. Si les données à importer utilisent un caractère particulier pour signaler les valeurs manquantes, vous pouvez l'indiquer à [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) avec l'argument na. Dans l'exemple ci-dessous, nous indiquons que le symbole * signale les valeurs manquantes :

mina_data <- read_csv("name, bloodvalue, sex, education
                      Adam, *, male, 1
                      Janet, 80.1, female, 2", na="*")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): name, sex
dbl (2): bloodvalue, education
mina_data
## A tibble: 2 × 4
  name  bloodvalue sex    education
  <chr>      <dbl> <chr>      <dbl>
1 Adam        NA   male           1
2 Janet       80.1 female         2

Les mêmes principes s'appliquent aux autres fonctions du package readr.

11.2.2 Changer de séparateur

Les fichiers DSV peuvent utiliser d'autres séparateurs que la virgule. Dans ce cas, on peut utiliser [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) et indiquer le séparateur, qui est ici le point-virgule (;) :

mina_data <- read_delim("name; bloodvalue; sex; education
                        Adam; 90.5; male; 1
                        Janet; 80.1; female; 2", delim=";")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
chr (4): name,  bloodvalue,  sex,  education
mina_data
## A tibble: 2 × 4
  name                            ` bloodvalue` ` sex`    ` education`
  <chr>                           <chr>         <chr>     <chr>
1 "                        Adam"  " 90.5"       " male"   " 1"
2 "                        Janet" " 80.1"       " female" " 2"

11.2.3 readr comparé aux fonctions standard de R

R dispose de fonctions intégrées pour lire les fichiers DSV. Ces fonctions se trouvent dans le package base et sont donc appelées fonctions base. La fonction pour lire les fichiers CSV est read.csv() (à ne pas confondre avec read_csv() du package readr). Nous recommandons les fonctions de readr et readxl pour les raisons suivantes :

  • readr et readxl sont plus rapides que les fonctions base.
  • readr et readxl disposent d'une barre de progression pour les fichiers volumineux.

Pour lire des fichiers très volumineux, les packages suivants sont recommandés :

  • fread() du package data.table.
  • vroom() du package vroom.

Data frame vs tibble

Lorsque vous importez des fichiers avec les fonctions standard de R, les objets créés sont des data frames. Les fonctions plus modernes des packages readr et readxl créent à la place des tibbles, un type de data frame qui fonctionne de manière fluide avec les fonctions de la vaste bibliothèque tidyverse. Vous ne remarquerez probablement pas si vous travaillez avec des tibbles ou des data frames.

11.3 Importer des fichiers depuis Excel

Les fichiers Excel peuvent être importés avec trois fonctions différentes du package readxl. Parmi ces fonctions, il suffit de se familiariser avec la fonction [read_excel()](https://readxl.tidyverse.org/reference/read_excel.html), car elle fonctionne pour tous les fichiers Excel.

Fonction du package readxl Explication
[read_excel()](https://readxl.tidyverse.org/reference/read_excel.html) Lit tous les fichiers (xls et xlsx).
[read_xls()](https://readxl.tidyverse.org/reference/read_excel.html) Lit les fichiers portant l'extension xls.
[read_xlsx()](https://readxl.tidyverse.org/reference/read_excel.html) Lit les fichiers portant l'extension xlsx.

Fonctions pour importer des données d'Excel vers R.

Supposons que nous ayons le fichier PatientData.xlsx dans notre working directory. Dans ce fichier, la première ligne contient les noms des colonnes (noms des variables). Nous lisons le fichier et l'enregistrons dans l'objet mina_data :

mina_data <- read_excel(path='PatientData.xlsx',
                        col_names = TRUE)

Supposons maintenant que le fichier PatientData.xlsx comporte trois feuilles (en anglais sheet) et que nous souhaitions l'importer avec les spécifications suivantes :

  • La première ligne contient les noms des colonnes.
  • Nous voulons importer la troisième feuille.
  • Nous voulons importer au maximum 500 lignes.
  • Nous voulons que R interprète l'astérisque (*) comme une donnée manquante, car c'est ainsi que nous avons indiqué les données manquantes dans notre fichier Excel.

Le code correspondant est le suivant :

mina_data <- read_excel(path='PatientData.xlsx',
                        col_names = TRUE,
                        sheet=3,
                        n_max=500,
                        na='*')

11.4 Lire des données depuis SAS

Les fichiers SAS utilisent les extensions *.*sas7bdat et .sas7bcat. Ils sont importés avec le package haven. La fonction s'appelle [read_sas()](https://haven.tidyverse.org/reference/read_sas.html) et fonctionne de manière très similaire à [read_csv()](https://readr.tidyverse.org/reference/read_delim.html). Voici un exemple d'importation d'un fichier SAS :

library(haven)
mina_data <- read_sas(data_file='PatientData.sas7bdat')

Pour obtenir de l'aide sur la fonction [read_sas()](https://haven.tidyverse.org/reference/read_sas.html), on utilise la commande :

?read_sas

N'oubliez pas d'installer haven (install.packages("haven")) si ce n'est pas déjà fait.

11.5 Lire des données depuis SPSS

Les fichiers SPSS utilisent les extensions .sav, .zsav ou .por. Tous ces fichiers peuvent être importés avec la fonction [read_spss()](https://haven.tidyverse.org/reference/read_spss.html), qui se trouve également dans le package haven. Voici un exemple d'importation d'un fichier SPSS :

library(haven)
mina_data <- read_spss(data_file='PatientData.sav')

Pour obtenir de l'aide sur la fonction [read_sav()](https://haven.tidyverse.org/reference/read_spss.html), on utilise la commande :

?read_spss

11.6 Lire des données depuis STATA

Les fichiers STATA utilisent l'extension *.*dta. Ces fichiers peuvent être importés avec la fonction [read_stata()](https://haven.tidyverse.org/reference/read_dta.html), qui se trouve également dans le package haven. Voici un exemple d'importation d'un fichier SPSS :

library(haven)
mina_data <- read_stata(data_file='PatientData.dta')

Pour obtenir de l'aide sur la fonction [read_stata()](https://haven.tidyverse.org/reference/read_dta.html), on utilise la commande :

?read_stata

11.7 Lire des données depuis l'eCRF REDCap

REDCap (Research Electronic Data Capture) est un CRF (Clinical Research Form) en ligne utilisé dans de nombreux services cliniques et universités. Dans REDCap, les données de recherche sont stockées sur un serveur, et l'utilisation de REDCap présente de nombreux avantages, en particulier dans les études prospectives

Il est possible d'importer des données directement de REDCap vers R avec le package REDCapR. Commencez par installer et activer le package :

install.packages("REDCapR")

Activez le package :

library(REDCapR)

Chaque projet dans REDCap possède un URI et un token. Connectez-vous à REDCap pour récupérer ces paramètres pour votre projet. On crée ensuite les objets uri et token comme suit :

uri   <- "https://bbmc.ouhsc.edu/redcap/api/"
token <- "9A81268476645C4E5F03428B8AC3AA7B"

Pour récupérer l'ensemble du jeu de données (y compris toutes les colonnes), on utilise la commande ci-dessous. Rappelons que nous avons spécifié la valeur des objets uri et token à l'étape précédente. Nous enregistrons le jeu de données dans notre nouvel objet mina_data.

mina_data <- redcap_read(redcap_uri = uri, token = token)$data

Vous disposez alors d'un data frame ordinaire contenant l'ensemble du jeu de données issu de REDCap.

Pour plus d'informations sur l'utilisation du package, consultez la documentation.

11.8 Lire des données depuis des bases de données (SQL)

Les packages ci-dessous permettent de lire des données depuis des bases de données SQL. Ils s'utilisent selon les mêmes principes que REDCap.

  • DBI
  • RMySQL
  • RSQLite
  • RPostgreSQL

11.9 Lire des fichiers hiérarchiques (XML, json)

Pour les données hiérarchiques, il existe les packages jsonlite pour le json et xml2 pour le XML.