library(learnr)
library(knitr)
library(rio)
library(skimr)
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)

dir.create(paste0(tempdir(),"/data"))
dir.create(paste0(tempdir(),"/data/chapitre_secret"))

file.copy(from = system.file(package = "funcampR","data","chapitre14/gcoc_crypt.txt"),
          to = paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))
ancien_parchemin <- import(paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))
ancien_parchemin <- import(paste0(tempdir(),"/data/chapitre_secret/gcoc_crypt.txt"))

Le mot magique

Pour trouver le mot magique qui permettra de faire apparaître le chemin vers le nouveau village, nous allons devoir user de magie pour remettre à leur place les éléments de l'ancien parchemin. Ce parchemin est déjà chargé, sous le nom de ancien_parchemin.

Découvrir le parchemin

Souvenez-vous du chapitre 2 du grimoire IGoR : nous avions appris à découvrir le contenu des livres de comptes avec des sortilèges élémentaires :

Allons-y !

Découvrons les premières lignes du parchemin avec le sortilège head():

head(ancien_parchemin)

A vous de jouer !

# découvrir les premières lignes du parchemin à l'aide du sortilège head



# fin de l'exercice
# découvrir les premières lignes du parchemin à l'aide du sortilège head

head(ancien_parchemin)

# fin de l'exercice

Ce parchemin semble vraiment complexe !

Essayons de voir le nom des colonnes avec le sortilège names():

names(ancien_parchemin)

A vous de jouer !

# afficher le noms des colonnes du parchemin à l'aide du sortilège names



# fin de l'exercice
# afficher le noms des colonnes du parchemin à l'aide du sortilège names

names(ancien_parchemin)

# fin de l'exercice

Diantre, 168 colonnes ! Ah nous voyons tout de même une certaine logique, certaines commencent par 'col' et d'autres par 'sup', intéressant...

Manipuler les colonnes

Grâce à la plume tidyverse, nous pourrons utiliser les sorts puissants de la magie dplyr

Pour utiliser cette plume, nous devons l'invoquer en écrivant 'library(tidyverse)' au début du programme R.

library(tidyverse)

Maintenant, nous allons pouvoir utiliser les sortilèges apportés par dplyr pour manipuler le parchemin.

Sortilège select

Lorsque l'on a un parchemin aussi complexe, il est pratique de choisir de ne travailler que sur certaines colonnes. Pour cela on utilise le sortilège select().

Afin de ne conserver que les colonnes id et garde, voici comment utiliser le sortilège select() :

select(ancien_parchemin, id, garde)

N'oublions pas qu'il est possible d'utiliser le pipe %>% pour d'enchaîner les sortilèges.

# utilisation du select() avec l'opérateur permettant d’enchaîner les sortilèges
ancien_parchemin %>% 
  select(id, garde)

A vous de jouer : sélectionner les colonnes id et sup1 du parchemin

# sélectionner les colonnes id et sup1 de ancien_parchemin



# fin de l'exercice
# sélectionner les colonnes id et sup1 de ancien_parchemin

ancien_parchemin %>% 
  select(id, sup1)

# fin de l'exercice

Il est aussi possible d'utiliser le sortilège select pour exclure certaines colonnes en indiquant un '-' devant le nom de la colonne.

Par exemple, pour retirer la colonne id du parchemin, nous lancerons le sortilège select(-id) :

# select permettant de retirer la colonne id
# NB : le sortilège head a été ajouté pour alléger (un peu) l'affichage (on n'affiche que les 6 premières lignes)
ancien_parchemin %>% 
  select(-id) %>% 
  head()

La magie de dplyr est extrêmement puissante ! Et encore plus si l'on utilise les charmes pour augmenter la puissance des sortilèges !

Voyons comment faire.

Select et charmes

Les charmes envoûtent les ingrédients et permettent d'augmenter la puissance des sortilèges.

Par exemple, le charme starts_with permet au sortilège select de sélectionner non pas juste une colonne mais toutes les colonnes commençant par...

# sélection des colonnes dont le nom commencent par "sup"
ancien_parchemin %>% 
  select(starts_with("sup"))

Voici les charmes (aussi appelé en langage runique helpers) les plus connus à utiliser avec le sortilège select :

Exemple : pour sélectionner les colonnes sup10, sup11, sup12, sup13 ... sup19, nous pouvons lancer le sortilège :

# sélection des colonnes dont le nom commencent par "sup1"
# le sortilège head a été ajouté pour alleger (un peu) l'affichage
ancien_parchemin %>% 
  select(starts_with("sup1")) %>% 
  head()

On remarquera que les colonnes gardent leur ordre d'origine. Pour réordonner les colonnes, il faut les appeler dans le bon ordre !

# sélection des colonnes sup10,sup11, sup12,sup13,sup14,sup15
# le sortilège head a été ajouté pour alléger (un peu) l'affichage
ancien_parchemin %>% 
  select(sup10,sup11, sup12,sup13,sup14,sup15) %>% 
  head()

Ce que le charme num_rang permet de faire rapidement : il construit une liste de noms de colonnes de type "prefixe" + numéro

# sélection des colonnes dont le nom sup10,sup11, sup12,...,sup19
# le sortilège head a été ajouté pour alléger (un peu) l'affichage
ancien_parchemin %>% 
  select(num_range("sup",10:19)) %>% 
  head()

À vous de jouer : Selectionner les colonnes col1, col2, col3, col4, col5 !

# Sélectionner les colonnes   col1, col2, col3, col4, col5



# fin de l'exercice
# Selectionner les colonnes  col1, col2, col3, col4, col5

ancien_parchemin %>% 
  select(num_range("col", 1:5))

# fin de l'exercice

Manipuler les lignes

Retournons à notre parchemin et regardons maintenant les lignes qui le composent

Affichons d'abord les 10 premières lignes à l'aide du sortilège head()

A vous de jouer : afficher les 10 premières lignes de l'ancien parchemin !

# afficher les 10 premières lignes de ancien_parchemin avec le sortilège head()



# fin de l'exercice
# afficher les 10 premières lignes de ancien_parchemin avec le sortilège head()

ancien_parchemin %>% 
  head(10)

# fin de l'exercice

Tri (arrange)

id semble être un numéro de classement.

Trions les lignes du parchemin par valeur croissante de la colonne id.

A vous de jouer : trier le parchemin selon l'id croissant (sortilège arrange()) :

# Trier les lignes de ancien_parchemin selon id croissant à l'aide du sortilège arrange



# fin de l'exercice
# Trier les lignes de ancien_parchemin selon id croissant à l'aide du sortilège arrange

 ancien_parchemin %>% 
  arrange(id)

# fin de l'exercice

Filtre

Certaines lignes semblent être protégées par des gardes. Ce sont sûrement les plus précieuses. Concentrons-nous sur elles !

Avec le sortilège filter(), filtrons les lignes afin de ne conserver que les lignes avec garde à "Oui" (opérateur ==)

# Conserver les lignes  avec garde=="Oui" de ancien_parchemin à l'aide de filter()



# fin de l'exercice
# Conserver les lignes  avec garde=="Oui" de ancien_parchemin à l'aide de filter()

 ancien_parchemin %>% 
  filter(garde=="Oui")

# fin de l'exercice

Maintenant que nous nous sommes entraînés, décryptons le parchemin grâce aux indices donnés par les généraux de Lériva.

À vous de prendre la plume !

# A partir des données de l'ancien_parchemin, 
# (i) Conserver les lignes utiles
# (ii) Réordonner les lignes (par id croissant)
# (iii) Sélectionner uniquement les colonnes avec le préfixe col dans le bon ordre



# fin de l'exercice
# A partir des données de l'ancien_parchemin, 
# (i) Conserver les lignes utiles
# (ii) Réordonner les lignes (par id croissant)
# (iii) Sélectionner uniquement les colonnes avec le préfixe col dans le bon ordre

 ancien_parchemin %>% 
  filter(garde=="Oui") %>%  
  arrange(id) %>% 
  select(num_range("col", 1:83)) 

# fin de l'exercice

Export sympa

Le parchemin se décrypte enfin ! .... mais reste dans la nébuleuse magique. Des trous (NA) multiples rendent la lecture difficile.

Afin de pouvoir lire paisiblement le résultat, nous allons l'inscrire sur un feuillet.

Pour cela il nous faut

Le sortilège write_delim() utilise :

Par exemple voici comment écrire le parchemin trié sur un feuillet :

#utilisation de la plume 
library(readr)

# écriture du parchemin sur le feuillet, 
#  - en collant les données (séparateur "")
#  - en remplaçant les Valeurs manquantes par des  espaces na=" ")
#  - en ne mettant pas les noms des colonnes
ancien_parchemin %>% 
  filter(garde=="Oui") %>%  
  arrange(id) %>% 
  select(num_range("col", 1:83)) %>% 
  write_delim("/tmp/feuillet.txt", delim = "", na = " ", col_names = FALSE)

À vous de jouer : écrivez dans le feuillet "/tmp/feuillet.txt" , le parchemin décrypté

# (i) Conserver les lignes avec garde=="Oui"
# (ii) Trier les lignes sur id ascendant
# (iii) Sélectionner les colonnes col1 à col83
# (iv) Ecrire le parchemin décrypté dans un feuillet avec les ingrédients delim = "",na = " ",col_names = FALSE



# fin de l'exercice
# (i) Conserver les lignes avec garde=="Oui"
# (ii) Trier les lignes sur id ascendant
# (iii) Sélectionner les colonnes col1 à col83
# (iv) Ecrire le parchemin décrypté dans un feuillet avec les ingrédients delim = "",na = " ",col_names = FALSE

library(readr)
ancien_parchemin %>% 
  filter(garde=="Oui") %>%  
  arrange(id) %>% 
  select(num_range("col", 1:83))  %>%
  write_delim("/tmp/feuillet.txt",delim = "",na = " ",col_names = FALSE)

# fin de l'exercice
downloadLink("downloadFic", "Téléchargez le fichier feuillet.txt")
  output$downloadFic <- downloadHandler(
    filename = function() { "feuillet.txt" },
    content = function(file) {
    file.copy("/tmp/feuillet.txt", file)
  }) 

Ouvrez le fichier feuillet.txt et découvrez le mot magique !

question("Le mot magique est :",
type="single",
allow_retry = TRUE,
incorrect="Retente ta chance",
answer("Phocea"),
answer("PorteEst",correct=TRUE),
answer("Menpenti"),
answer("SuperDR"),
correct="Félicitations, la réponse à donner à Lériva est donc : PorteEst (sans espace et avec P et E majuscules)"
)

Vous avez trouvé ? Reportez la réponse dans le jeu Icarius pour reprendre la partie...

Fin du chapitre >> reprenez la partie d'Icarius !!!

Version testcore 0.6



InseeFrLab/funcamp-r-grimoire documentation built on Oct. 30, 2023, 3:25 p.m.