User Tools

Site Tools


r_atelier2

Ateliers R du CSBQ

Cette série de 10 ateliers guide les participants à travers les étapes requises afin de maîtriser le logiciel R pour une grande variété d’analyses statistiques pertinentes en recherche en biologie et en écologie. Ces ateliers en libre accès ont été créés par des membres du CSBQ à la fois pour les membres du CSBQ et pour la grande communauté d’utilisateurs de R.

Le contenu de cet atelier a été révisé par plusieurs membres du CSBQ. Si vous souhaitez y apporter des modifications, veuillez SVP contacter les coordonnateurs actuels de la série, listés sur la page d'accueil

Atelier 2 : Charger et manipuler des données

Développé par : Johanna Bradie, Vincent Fugère, Thomas Lamy

Résumé : Durant cet atelier, vous apprendrez comment charger et visualiser des données dans R. Vous apprendrez certaines fonctions permettant d’examiner vos données et vous apprendrez comment corriger certaines erreurs communes se produisant lors du chargement des données. Finalement, vous verrez l’importance de sauvegarder votre travail dans un script R, soit un fichier texte contenant tous vos codes et permettant de refaire toutes vos analyses en appuyant sur une seule touche! (ou deux, ou trois peut-être…)

Lien vers la présentation Prezi associée : Prezi

Téléchargez les scripts et les données requis pour cet atelier :

Objectifs d'apprentissage

  1. Écrire un script dans R
  2. Charger, explorer et enregister des données
  3. Réparer un jeu de données “endommagé”

Écrire un script dans R

Un script R est un fichier texte contenant toutes les commandes nécessaires pour réaliser un projet. Une fois écrit et enregistré, votre script R vous permettra d'apporter des changements et de refaire des analyses avec un minimum d'effort.

Afin d'utiliser un script dans RStudio, il suffi simplement de surligner une commande et appuyer sur “Run” ou appuyer sur “command-enter” (Mac) ou “ctrl-enter” (PC).

Commandes & Commentaires

Utilisez le symbole '#' pour insérer des commentaires au sein d'un script. Ceci indique à R d'ignorer tout ce qui se trouve à la suite du symbole '#' lors de l'exécution de commandes.

Puisque les commentaires sont ignorés par R lors de l'exécution de scripts, il est possible de se laisser des notes ou d'indiquer à des collaborateurs ce qui a été fait. Un script enrichi de commentaires est une bonne façon de collaborer à une science reproductible et permet de comprendre comment R fonctionne.

# Ceci est un commentaire, pas une commande !

En-têtes

Il est recommandé d'ajouter des commentaires au début de chaque script sous forme d'en-tête en indiquant quelques informations essentielles : nom du projet, auteur, date et version de R.

Exemple d'en-tête
## Atelier R du CSBQ ##
## Atelier 2 - Charger et manipuler des données
## Auteur: Centre de la science de la biodiversité du Québec
## Date: Automne 2014
## R version 2.15.0

En-têtes de section

Vous pouvez utiliser quatre symboles '#' de suite pour créer un en-tête de section. C'est utile pour organiser un script.

Par exemple :

#### Chargement du fichier de données ####

RStudio affiche une petite flèche juste à côté du numéro de ligne où l'en-tête de section a été créé. Si vous cliquez sur la flèche, cette partie du script sera cachée.

Nettoyage

C'est une bonne habitude de maintenir son espace de travail propre en effaçant la mémoire de R ! À l'aide d'une simple commande, il est possible d'éviter plusieurs erreurs telles qu'utiliser un vieux jeu de données qui serait resté dans l'espace de travail. La commande rm(list=ls()) efface la mémoire.

| Nettoyage
rm(list=ls())  # Efface ce qui se trouve dans l'espace de travail
?rm
?ls

On peut tester cette commande en ajoutant des objets dans l'espace de travail pour mieux comprendre comment rm(list=ls()) fonctionne.

|
A<-"Test"     # On crée un objet "A".
A <- "Test"   # C'est préférable de mettre des espaces avant et après "<-".
A = "Test"    # = peut aussi être utilisé comme opérateur d'assignation
 
#Tel que vu au premier atelier, il est préférable d'utiliser "<-" comme opérateur d'assignation plutôt que "=".
 
A
rm(list=ls())
A

Petit rappel important

  1. R est prêt à exécuter une commande lorsque vous voyez le chevron > affiché dans la console. Si le chevron n'apparaît pas, c'est que la commande est incomplète : R attend que vous complétiez la commande. Appuyez sur 'ESC' pour sortir de cette commande.
  2. R est sensible à la casse, i.e. “A” est différent de “a”.
|
a<-10  
A<-5
a
A
 
rm(list=ls())  # On nettoie l'espace de travail à nouveau !

Charger, explorer et enregistrer des données

Répertoire de travail

Vous devez indiquer à R le répertoire où se trouvent les fichiers de données afin de les charger. Vous pouvez voir quel répertoire R utilise avec la fonction getwd()

|
getwd() # Cette commande vous indique le répertoire dans lequel vous vous trouvez.

Lorsque vous chargez un script, R définit le répertoire de travail comme étant celui qui contient le script.

Afin de spécifier un chemin d'accès, il faut utilise le ”/“ pour séparer les dossiers, sous-dossiers et noms de fichiers.

Il y a plusieurs façons de définir un répertoire de travail :

  • Vous pouvez simplement taper le chemin d'accès complet du répertoire entre les parenthèses de la fonction setwd(). Par exemple :
|
setwd('/Users/vincentfugere/Desktop/QCBS_R_Workshop2')  # Exemple pour Mac 
setwd('C:/Users/Johanna/Documents/PhD/R_Workshop2')   # Exemple pour Windows
# **Prenez note que cet exemple ne fonctionnera PAS sur votre ordinateur !
  • Vous pouvez utiliser la fonction choose.dir(). Une fenêtre contextuelle apparaîtra pour vous permettre de sélectionner un répertoire approprié.
|
setwd(choose.dir())  # Prenez note que cette commande peut ne pas fonctionner sur un Mac.
  • Vous cliquez sur session / Définir le répertoire / Choisir le répertoire

Afficher Le Contenu du Répertoire De Travail

La fonction dir() affiche le contenu du répertoire de travail.

|
dir() # Cette commande vous indique le contenu du répertoire dans lequel vous vous trouvez.

Vous pouvez contrôler:

  • Si le fichier que vous projetez d'ouvrir se trouve dans le répertoire de travail ou non
  • L'orthographe du nom du fichier (e.g. 'monfichier.csv' au lieu de 'MonFichier.csv')

Importer des données

Utilisez la fonction read.csv() pour importer des données provenant d'un fichier .csv dans R.

|
CO2<-read.csv("CO2_good.csv")
# Cette commande crée un objet nommé CO2 en chargeant les données
# du fichier nommé "CO2_good.csv".

Cette commande spécifie que vous créez un objet nommé “CO2” en lisant un fichier .csv nommé “CO2_good.csv”. Ce fichier doit se trouver dans votre répertoire de travail.

Il est aussi possible d'utiliser la fonction file.choose() pour charger un fichier de manière interactive.

|
CO2<-read.csv(file.choose()) 

Rappelez-vous que le point d'interrogation peut être utilisé pour trouver de l'aide sur une fonction.

|
?read.csv # Ceci fera apparaître la page d'aide pour la fonction read.csv().  

La page d'aide permet de voir qu'il y a un argument header qui permet de spécifier si la première ligne du fichier contient le nom des colonnes. Inscrire header=TRUE indique à R que la première ligne du tableau contient les noms des colonnes.

|
CO2<-read.csv("CO2_good.csv", header = TRUE) 

NOTE : Si vous utilisez un système d'exploitation en français ou un éditeur CSV, il est possible que vous deviez utiliser la fonction read.csv2() au lieu de la fonction read.csv() pour importer correctement un fichier.

Visualiser des données

Le jeu de données “CO2” contient des mesures répétées d'absorption de CO2 prises sur six plantes du Québec et six plantes du Mississippi à différentes concentrations de CO2 ambiant. La moitié des plantes de chaque région a subi un traitement de refroidissement la veille du début de l'expérience.

Voici quelques commandes utiles pour visualiser le jeu de données importé :

CO2 Affiche le tableau de données complet dans la console
head(CO2) Affiche les premières lignes du tableau de données
names(CO2) Affiche le nom des colonnes du tableau de données
attributes(CO2) Affiche les attributs du tableau de données
ncol(CO2) Affiche le nombre de colonnes du tableau de données
nrow(CO2) Affiche le nombre de lignes du tableau de données
summary(CO2) Calcule quelques statistiques de base sur les variables
str(CO2) Affiche la structure du tableau de données

La fonction str() est très utile pour identifier le type/mode de chaque colonne (e.g. afin de vérifier que les facteurs sont enregistrés comme facteurs et que les données numériques sont de type numérique ou nombre entier). Plusieurs problèmes sont fréquents lors de l'importation des données :

  • Les facteurs apparaissent comme des chaînes de caractères (et vice versa)
  • Les facteurs ont trop de niveaux à cause d'une erreur de frappe
  • Les données numériques sont stockées sous forme de chaînes de caractères à cause d'une erreur de frappe (e.g. un espace de trop ou utiliser la virgule au lieu du point pour indiquer les décimales)

Exercice

Chargez les données de nouveau en utilisant le script suivant :

|
CO2<-read.csv("CO2_good.csv",header=FALSE)

Vérifiez la structure des données avec la fonction str(). Quel est le problème ? Chargez les données de nouveau, mais cette fois-ci avec l'argument header=TRUE avant de continuer.

Rappel de l'atelier 1 : accéder aux données

Les données peuvent être extraites d'un jeu de données de plusieurs façons. Considerons un jeu de données nommé mydata. Les crochets permettent d'extraire le contenu d'une cellule.

|
mydata[2,3] # extrait le contenu de la deuxième ligne / troisième colonne

Si le numéro de la colonne est omis, toute la ligne est extraite.

|
mydata[1,] # extrait le contenu de la première ligne

Si le numéro de la ligne est omis, toute la colonne est extraite. De même, le symbôle $ suivi de l'en-tête de la colonne peut être utilisé.

|
mydata[,1] # extrait le contenu de la première colonne
mydata$en-tête # extrait le contenu de la colonne dont l'en-tête correspond

Exploration des données

Ça peut être très utile de représenter les variables graphiquement pour examiner les données.

|
plot(CO2) # Fait des graphiques de toutes les combinaisons de variables

Pour vérifier si une variable est distribuée normalement, utilisez la fonction hist() :

|
hist(CO2$uptake) # Le symbole $ permet d'extraire une colonne spécifique par son nom.

Plusieurs fonctions intégrées à R vous permettent d'obtenir de l'information sur vos données. Les fonctions mean() et sd() sont couramment utilisées.

|
conc_mean<-mean(CO2$conc) # Calcule la moyenne de la colonne "conc" de l'objet "CO2"
                          # Enregistré en tant que "conc_mean"
conc_mean # Affiche l'objet "conc_mean" dans la console
 
conc_sd<-sd(CO2$conc) # Calcule l'écart-type de la colonne "conc" et l'enregistre en tant que "conc_sd"
conc_sd

La fonction apply() est utilisée pour appliquer une fonction à plusieurs colonnes en même temps. Utilisez ?apply pour en apprendre plus.

|
?apply

Afin d'utiliser la fonction apply(), trois arguments doivent être spécifiés. Le premier argument est le jeu de données sur lequel on veut appliquer une fonction. Le deuxième argument spécifie si la fonction est appliquée aux lignes (MARGIN = 1) ou aux colonnes (MARGIN = 2). Le dernier argument spécifie la fonction à appliquer. Par exemple :

|
apply(CO2[,4:5], MARGIN = 2, FUN = mean) # Calcule la moyenne des colonnes 4 et 5 du jeu de données CO2

Enregistrer son espace de travail

En enregistrant votre espace de travail, vous pouvez enregistrer les scripts et les objets qui sont actuellement chargés dans R. Si vous enregistrez votre espace de travail, vous pouvez chargez tous les objets même si vous avez utilisé la commande rm(list=ls()) afin de nettoyer tout ce qui se trouve dans l'espace de travail.

Utilisez la fonction save.image() pour enregistrer l'espace de travail :

|
save.image(file="CO2_project_Data.RData") # L'espace de travail est enregistré
 
rm(list=ls())  # Ça nettoie l'espace de travail
 
load("CO2_project_Data.RData") # On charge tout ce qui se trouvait dans l'espace de travail
 
head(CO2) # Ça marche :)

Exporter des données

Si vous voulez enregistrer des données que vous avez créées ou modifiées dans R, utilisez la fonction write.csv(). Le fichier ainsi créé sera enregistré dans le répertoire de travail.

|
write.csv(CO2,file="CO2_new.csv") # L'objet CO2 est enregistré dans le fichier nommé CO2_new.csv

Préparer des données pour l'importation dans R

  • Lors de la préparation de fichiers à importer dans R, vous devriez les enregistrez en tant que fichiers .csv
  • Presque toutes les applications (Excel, GoogleDocs, LibreOffice, etc.) peuvent enregistrer au format .csv (“comma separated values”)
  • Utilisez des noms de variables courts et informatifs (i.e. “Temps_1” au lieu de “Temps de la premiere mesure”)
  • Les valeurs des colonnes doivent correspondre à l'usage prévu
  • Pas de texte dans les colonnes de mode numérique (ceci inclut les espaces !)
  • Identifiez les valeurs manquantes par NA
  • Évitez les valeurs numériques pour les variables n'ayant pas vraiment de valeur numérique (i.e. individu, réplicat, traitement)
    • Par exemple, identifiez vos individus par “A,B,C” ou “ind1,ind2,ind3” au lieu de “1,2,3”
  • N'ajoutez pas de notes, d'en-têtes supplémentaires ou de cellues fusionnées !

Il est possible de faire toute la préparation des données dans R. Les avantages sont :

  • Ça économise du temps pour les grosses bases de données
  • Ça préserve les données d'origine
  • Ça permet de basculer entre les modes “long” et “large” très facilement (plus de détails dans l'atelier 4)
  • Pour des informations complémentaires, consultez la page suivante : https://www.zoology.ubc.ca/~schluter/R/data/

Utilisez vos propres données

Défi R

Essayez de charger, explorer, représenter graphiquement et enregistrer vos propres données dans R. Est-ce que le chargement fonctionne ? Si ce n'est pas le cas, essayez d'arranger vos données dans Excel. Enregistrez vos données “arrangées” et essayez de les ouvrir dans R.

Réparer un jeu de données "endommagé"

Défi R plus difficile

Importez un jeu de données “endommagé” dans R et trouvez les problèmes.

|
CO2<-read.csv("CO2_broken.csv") # On écrase l'ancien objet CO2 et on le remplace avec le contenu
                                # d'un nouveau jeu de données
head(CO2) # Ça semble en désordre
CO2 # En effet !
  • Vos données ressemblent probablement à ça !
  • Réparez le jeu de données dans R (ou pas)
  • Faites un essai avant de regarder la solution
  • Entraidez-vous entre voisins et amusez-vous :)

Voici quelques fonctions qui peuvent vous aider :

  • read.csv()
  • head()
  • str()
  • class()
  • unique()
  • levels()
  • which()
  • droplevels()

Note : Vous devez mettre le nom de l'objet entre parenthèses pour utiliser ces fonctions (i.e. head(CO2)). Rappelez-vous que vous pouvez obtenir de l'aide en utilisant ”?“ (e.g. ?str).

Indice : Il y a quatre problèmes avec ce jeu de données !

Réponses :

Réponse #1

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Problème #1 : On dirait que les données sont contenues dans une seule colonne
Solution :

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Importez les données de nouveau, mais en spécifiant comment chaque valeur est séparée. L'argument “sep” indique à R quel type de caractère sépare les valeurs sur chaque ligne. Ici, une tabulation sépare les valeurs au lieu d'une virgule.

|
CO2 <- read.csv("CO2_broken.csv",sep = "")
?read.csv

Réponse #2

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Problème #2 : Les données ne commencent pas avant la troisième ligne. Les en-têtes de colonnes sont remplacés par des notes.

|
head(CO2) # La fonction head() permet de voir que les données n'ont pas été lues avec les bons en-têtes

Solution :

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Pour régler ce problème, vous devez indiquer à R de sauter les deux premières lignes avec l'argument “skip”.

|
CO2<-read.csv("CO2_broken.csv",sep = "",skip=2)  # En ajoutant l'argument skip, R ignore les deux premières lignes.
head(CO2) # Le tableau a maintenant des en-têtes appropriés.

Réponse #3

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Problème #3 : Les variables “conc” et “uptake” sont considérées commes des facteurs au lieu de nombres, car il y a du texte dans ces colonnes.

|
str(CO2) # La fonction str() montre que les colonnes 'conc' et 'uptake' sont considérées comme facteurs.
class(CO2$conc)
unique(CO2$conc) # En examinant les valeurs uniques de cette colonne,
                 # on voit que ces deux colonnes contiennent la valeur "cannot_read_notes".
unique(CO2$uptake) 
?unique

Solution :

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

|
CO2 <- read.csv("CO2_broken.csv",sep = "",skip = 2,na.strings = c("NA","na","cannot_read_notes")) 

En identifiant “cannot_read_notes” comme valeur manquante (i.e. NA), R peut maintenant ces colonnes correctement. Rappelez-vous que NA signifie “Not available”.

|
head(CO2)
str(CO2) # La variable 'conc' est maintenant de type 'integer' (nombre entier)et la variable 'uptake' est maintenant de type numérique.

Réponse #4

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

Problème #4 : En réalité, il n'y a seulement que deux traitements (chilled & non chilled), mais des erreurs d'orthographe créent deux autres traitements.

|
str(CO2) # Vous voyez qu'il y a quatre niveaux de traitement
levels(CO2$Treatment)
unique(CO2$Treatment) # Les quatre différents traitements sont "nonchilled", "nnchilled", "chilled" et "chiled"

Solution :

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

|
# Vous pouvez utiliser la fonction which() afin de trouver les lignes avec l'erreur "nnchilled"
which(CO2$Treatment=="nnchilled") # Cette commande nous indique que l'erreur se trouve à la ligne 10
# Vous pouvez corriger l'erreur par indexation (voir atelier 1) :
CO2$Treatment[10] <- "nonchilled"
# Vous pouvez faire ces deux étapes en une seule commande :
CO2$Treatment[which(CO2$Treatment=="nnchilled")] <- "nonchilled"
# Faisons la même chose pour "chiled" :
CO2$Treatment[which(CO2$Treatment=="chiled")] <- "chilled" 

Est-ce que les problèmes sont réglés ?

|
str(CO2)  # La fonction str() identifie toujours quatre niveaux de facteur pour la variable traitement
unique(CO2$Treatment) # Cependant, la fonction unique() indique que seulement deux niveaux sont utilisés
CO2<-droplevels(CO2) # La fonction droplevels() supprime les niveaux inutilisés de tous les facteurs du tableau de données
str(CO2) # C'est réparé !
r_atelier2.txt · Last modified: 2016/10/21 10:45 by vincent_fugere