Retour à la page d’accueil


Dans cette partie du cours vous allez apprendre à restructurer des tables dans R. Ces changement sont parfois nécessaire pour mettre les données dans le format adapté au graphique que vous voulez réaliser.

Aujourd’hui nous allons voir comment:

  1. Combiner une filtration de lignes avec un graphique

  2. Ajouter ou modifier des colonnes

  3. Concaténer ou séparer des colonnes


Mise en place

Tout d’abord, créez un nouveau script R et préparez votre environnement de travail:

# Chargez la librairie `tidyverse`

# Changez votre répertoire de travail pour être dans `session4_reorganisation_suite`

# Importer `burghardt_et_al_2015_expt1.txt` et mettez le dans un objet appelé `expt1`


Combiner des sélections de lignes avec un graphique

Afin de pouvoir combiner la sélection de données avec un graphique, nous devons d’abord apprendre à faire des chaines de commandes.

Créer des chaînes de commandes avec les pipes %>%

Les “pipes” (%>%) permettent de faire une séquence d’opération sur des données, sans avoir besoin de créer des objets intermédiaires (ou de faire des commandes imbriquées très compliquées)

Imaginons que nous voulions faire les sélections suivantes sur notre table:

  • Filtrer des données pour ne garder que les plantes qui ont été vernalisées

  • Ne garder que deux colonnes: le génotype et la taille totale des feuilles

Grace au symbole %>% pipe, nous pouvons créer une chaîne de commandes. Pour cela nous devons d’abord faire une commande et ajouter %>% à la fin de la ligne qui va utiliser le résultat de cette commande comme input pour la fonction à la ligne suivante. Voici comment faire:

expt1 %>% 
  filter(vernalization == "V") %>% 
  select(genotype, total.leaf.length.mm)
## # A tibble: 330 × 2
##    genotype total.leaf.length.mm
##    <chr>                   <dbl>
##  1 Col Ama                  22.1
##  2 Col Ama                  26.8
##  3 Col Ama                  27.9
##  4 Col Ama                  22.8
##  5 Col Ama                  24.9
##  6 Col Ama                  22.2
##  7 Col Ama                  24.1
##  8 Col Ama                  21.4
##  9 Col Ama                  36  
## 10 Col Ama                  29.9
## # ℹ 320 more rows

Exercice 1: Utilisez %>% pour faire la suite de sélections suivantes sur expt1:

  • Gardez les plantes qui ne sont pas du background Ler, et qui ont été traitées avec la température fluctuante.
  • Ne gardez que les colonnes qui contiennent le génotype, la longueur de “blade” et des information sur le “bolting”


BONUS: Transformez l’enchainement de commandes afin d’utiliser des pipes %>% plutôt que objets intermédiaires

expt1 <- read_tsv("../data/burghardt_et_al_2015_expt1.txt")

expt1_filtered <- filter(expt1, fluctuation=="Con" & day.length=="16")

expt1_selected <- select(expt1_filtered,days.to.bolt:total.leaf.length.mm)

summary(expt1_selected)
##   days.to.bolt    days.to.flower  rosette.leaf.num cauline.leaf.num
##  Min.   : 15.00   Min.   : 21.0   Min.   : 6.00    Min.   : 1.000  
##  1st Qu.: 26.75   1st Qu.: 39.0   1st Qu.:14.00    1st Qu.: 4.000  
##  Median : 41.50   Median : 49.0   Median :30.00    Median : 7.000  
##  Mean   : 45.00   Mean   : 53.6   Mean   :31.67    Mean   : 6.827  
##  3rd Qu.: 57.00   3rd Qu.: 70.0   3rd Qu.:46.00    3rd Qu.: 9.000  
##  Max.   :152.00   Max.   :135.0   Max.   :91.00    Max.   :13.000  
##                   NA's   :7       NA's   :9        NA's   :9       
##  blade.length.mm total.leaf.length.mm
##  Min.   : 8.20   Min.   :10.90       
##  1st Qu.:14.45   1st Qu.:22.12       
##  Median :19.20   Median :30.50       
##  Mean   :18.39   Mean   :29.01       
##  3rd Qu.:21.57   3rd Qu.:34.52       
##  Max.   :28.20   Max.   :47.00       
##  NA's   :78      NA's   :62

Combiner avec un graphique

Avec le pipe nous pouvons aussi utiliser l’output d’une commande (ou d’une chaîne de commandes) comme un input pour ggplot afin de faire un graphique sur les données sélectionnées. Ceci est très utile lors de la phase d’exploration des données (sans avoir à créer de nouveaux objets avec en permanence <-).

Nous pouvons par exemple faire un box plot pour le temps de floraison en fonction de la fluctuation de température, mais celle fois uniquement pour les plantes qui ont été vernalisées:

expt1 %>% 
  filter(vernalization == "V") %>% 
  ggplot(aes(fluctuation, days.to.flower)) + 
  geom_boxplot()

Exercice 2: Faite un violon plot du temps de floraison pour les différents génotypes, mais uniquement pour les plantes ayant poussées en jours court (8h de lumière).

Aide: Utilisez filter() pour sélectionner les données et ensuite un pipe (%>%) pour utiliser l’output pour le graphique.

BONUS

Représentez, uniquement pour les plantes qui contiennent le mot “Col” dans le background, et qui ont poussée à 22°C, un box plot de days.to.bolt en fonction du vernalization, coloré en fonction de la fluctuation. Séparez les graphiques pour avoir une facet par génotype. Utilisez un thème de type theme_bw.

Interprétez le résultat Est-ce que le temps de floraison de certains génotypes est affecté par la fluctuation de température. Si oui lesquels?


Modifier ou ajouter des colonnes avec mutate()

La fonction mutate() permet d’ajouter de nouvelles variables (i.e. nouvelles colonnes) dans une table, ou de modifier des colonnes déjà existantes.

source de l’image

Par exemple, ajoutons une colonne leaf.length.cm qui va contenir la longueur des feuilles en cm. Pour cela nous devons créer une nouvelle colonne en utilisant la colonne leaf.length.mm qui existe dans la table.

# Créez une nouvelle table avec la colonne supplémentare  
expt1.cm <- mutate(expt1, total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que la nouvelle colonne est bien là
colnames(expt1.cm)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "vernalization"        "bolt.survival"        "bolt"                
## [10] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [13] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [16] "total.leaf.length.cm"

Nous pouvons aussi créer et modifier plus d’une colonne à la fois, en les séparant par une virgule (,) dans la fonction mutate():

# Créez deux nouvelles colonnes
expt1.cm <- mutate(expt1, 
                   blade.length.cm = blade.length.mm/10,
                   total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que les nouvelles colonnes sont bien là
colnames(expt1.cm)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "vernalization"        "bolt.survival"        "bolt"                
## [10] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [13] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [16] "blade.length.cm"      "total.leaf.length.cm"

Attention!! Si vous utilisez le nom d’une colonne déjà existante, vous allez la modifier et non créer une nouvelle colonne.

Exercice 3:

Créez une nouvelle colonne “blade.ratio” avec le ratio de blade.length.mm et total.leaf.length.mm

BONUS:
Créez une nouvelle colonne “late.flowering” qui contient TRUE si days.to.bolt est supérieur à 70, et FALSE days.to.bolt est inférieur à 70.
Aide: Trouvez la solution en utilisant google


Concaténer ou séparer des colonnes avec unite() et separate()


Pour concaténer deux ou plusieurs colonnes ensemble, utilisez la fonction unite(). Par exemple, pour concaténer vernalization, survival.bolt et bolt:

# Créez deux nouvelles colonnes
expt1.concatenated <- unite(expt1, "Vern_survival_bolt",vernalization,bolt.survival,bolt)

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.concatenated)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "Vern_survival_bolt"   "days.to.bolt"         "days.to.flower"      
## [10] "rosette.leaf.num"     "cauline.leaf.num"     "blade.length.mm"     
## [13] "total.leaf.length.mm"

A contrario, pour séparer une colonne en deux ou plusieurs colonnes, utilisez la fonction separate(). Par exemple, pour séparer la colonne barkground :

# Créez deux nouvelles colonnes
expt1.separated <- separate(expt1, background, into=c("genotype_background", "FRI_mutation"))

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.separated)
##  [1] "plant_nb"             "genotype"             "genotype_background" 
##  [4] "FRI_mutation"         "temperature"          "fluctuation"         
##  [7] "day.length"           "vernalization"        "bolt.survival"       
## [10] "bolt"                 "days.to.bolt"         "days.to.flower"      
## [13] "rosette.leaf.num"     "cauline.leaf.num"     "blade.length.mm"     
## [16] "total.leaf.length.mm"



Exercice 4:

Reproduisez cette figure de Burghard et al 2015

Aide:

  • Créez une nouvelle colonne (blade.ratio) avec le ratio de blade.length.mm et total.leaf.length.mm

  • Créez une nouvelle colonne (nommée par exemple condition) en concaténant day.length, temperature et fluctuation

  • Sélectionnez les background Col et Ler

  • Faites un boxplot du ratio de blade.length.mm et total.leaf.length.mm en fonction de la condition, en créant des facets en fonction du background

  • Pas besoin de mettre de la couleur qui n’apporte rien au graphique

  • N’essayez pas de reproduire l’ordre des conditions (sur l’axe x). Nous verrons comment le faire à la prochaine séance

BONUS: Ce bonus vous permettra d’avoir des valeurs de x plus proches du graphique

  • Avant de créer la nouvelle colonne en concaténant day.length, temperature et fluctuation, créer une colonne LD.SD dans laquelle vous aurez “LD” à la place de la valeur “16” de la colonne day.length, et “SD” à la place de la valeur “8” de la colonne day.length. Utilisez ensuite cette colonne LD.SD pour la concaténation avec temperature et fluctuation pour créer la colonne condition
  • Changez le thème du graphique pour enlever la grille et avoir un fond blanc.




Contrôle continu à faire pour la prochaine séance

A partir ce ce que nous avons vu aujourd’hui:

- Commencez la deuxième moitié du contrôle continu dont les instructions sont ici


Retour à la page d’accueil