Prétraitement
avec le tidyverse

Importer, nettoyer et vérifier des données en R

Aurélien Nicosia · 23 septembre 2026
STT-4230 / STT-6230

Enchaîner les opérations avec |>

meteo |>
  filter(station == "Lévis") |>
  select(date, precip_mm) |>
  arrange(date)
Code Ce qu’il fait
meteo Le tableau de départ
filter() Garder les lignes de Lévis
select() Garder deux colonnes
arrange() Trier les lignes par date

Ici, |> passe le tableau à la fonction suivante comme premier argument.
Chaque étape utilise le résultat de la précédente.

Retour sur le mini-test

Importation

Un fichier utilise ; entre les colonnes et , pour les décimales.
Quelle fonction utiliser pour le lire ?

readr::read_csv2() est conçu pour ce format.

Un exemple : des données météo

Mesures météo fictives à Québec et à Lévis. Températures en °C, pluie en mm.

Date Station Min. Max. Pluie
01/09/2026 ” québec ” 8,2 18,5 1,5
02/09/2026 “QUÉBEC” 9,0 19,0 -2,0
03/09/2026 “Québec” NA 17,0 NA
01/09/2026 “Lévis” 7,0 18,0 0,0
02/09/2026 ” LÉVIS” 8,0 20,0 4,0
03/09/2026 “Lévis” 6,0 16,5 8,0
01/09/2026 “Lévis” 7,0 18,0 0,0

Que faut-il corriger avant de faire des calculs ?
Regardez les noms des villes, les dates, la pluie négative et la ligne répétée.

Importer le fichier et examiner les données

brut <- read_csv2(
  fichier_brut, trim_ws = FALSE,
  col_types = cols(
    date_texte = col_character(),
    ville = col_character(),
    .default = col_double()
  )
)
glimpse(brut)

glimpse(brut) montre :

  • 7 lignes et 5 colonnes;
  • les dates et les stations stockées comme du texte;
  • les trois mesures numériques.

Les trois mesures sont déjà numériques.
Les dates sont encore du texte : il faudra les convertir.

Choisir et renommer les colonnes

meteo <- brut |>
  rename(station = ville,
         temp_min_c = tmin, temp_max_c = tmax,
         precip_mm = pluie) |>
  select(station, date_texte,
         starts_with("temp_"), precip_mm)
Fonction Ce qu’elle change
rename(nouveau = ancien) Les noms des colonnes
select() Les colonnes conservées et leur ordre
starts_with("temp_") Sélectionne les noms qui commencent par temp_

Les sept lignes sont conservées.

Uniformiser les noms et convertir les dates

meteo <- meteo |>
  mutate(
    station = str_to_title(str_squish(station),
                           locale = "fr"),
    date = dmy(date_texte)
  ) |>
  select(-date_texte) |>
  relocate(date)

str_squish() enlève les espaces superflus.

str_to_title() transforme ici « QUÉBEC » en « Québec ».

dmy() lit une date écrite dans l’ordre jour, mois, année.

relocate() déplace la colonne date au début du tableau.

« québec », « QUÉBEC » et « Québec » deviennent « Québec ».
La colonne date est maintenant de type Date.

Créer une variable avec mutate

meteo <- meteo |>
  mutate(amplitude_c = temp_max_c - temp_min_c)
Date Station Min. °C Max. °C Amplitude °C
2026-09-01 Québec 8.2 18.5 10.3
2026-09-02 Québec 9.0 19.0 10.0
2026-09-03 Québec NA 17.0 NA

L’amplitude est calculée ligne par ligne.
Si une des deux températures manque, l’amplitude reste manquante.

Recoder avec if_else et case_when

meteo <- meteo |>
  mutate(
    precip_mm = if_else(precip_mm < 0,
                        NA_real_, precip_mm),
    etat = case_when(
      is.na(precip_mm) ~ "Manquante",
      precip_mm == 0 ~ "Nulle",
      .default = "Positive"
    )
  )

if_else() remplace les pluies négatives par NA.

case_when() classe chaque valeur : manquante, nulle ou positive.

Sur les sept lignes de départ :

Étape Négatives Manquantes
Avant 1 1
Après 0 2

La pluie négative devient NA : on passe de 1 à 2 valeurs manquantes.
On ne la remplace pas par zéro, car on ne sait pas s’il a plu.

Repérer et retirer les doublons

doublons <- meteo |>
  count(station, date) |>
  filter(n > 1)
propre <- meteo |> distinct()

Cette station apparaît deux fois à la même date :

station date n
Lévis 2026-09-01 2

Ici, les deux lignes sont identiques.
distinct() ramène la table à six lignes.

Si les deux lignes contenaient des mesures différentes,
il faudrait comprendre pourquoi avant d’en supprimer une.

Choisir des lignes et les trier

selection_pluie <- propre |>
  filter(station == "Lévis", precip_mm >= 4) |>
  select(date, precip_mm) |>
  arrange(desc(precip_mm))
print(selection_pluie)
#> # A tibble: 2 × 2
#>   date       precip_mm
#>   <date>         <dbl>
#> 1 2026-09-03         8
#> 2 2026-09-02         4

Les conditions séparées par une virgule doivent toutes être vraies.
desc() trie les valeurs de la plus grande à la plus petite.

filter() garde seulement les lignes pour lesquelles la condition vaut TRUE.
Une ligne dont la condition vaut NA est donc retirée.

Une ligne de résumé par station

bilan <- propre |>
  group_by(station) |>
  summarise(
    n_lignes = n(),
    n_mesures = sum(!is.na(precip_mm)),
    pluie_moy = mean(precip_mm, na.rm = TRUE),
    .groups = "drop"
  )
Station Mesures Moy. mm
Lévis 3 4.0
Québec 1 1.5

na.rm = TRUE exclut les valeurs manquantes du calcul de la moyenne.

n() compte les lignes; sum(!is.na(...)) compte les mesures observées.
À Québec, la moyenne repose sur une seule mesure de pluie.

group_by() définit les groupes; summarise() produit les résumés.
.groups = "drop" retire le regroupement du résultat.

Appliquer un calcul à plusieurs colonnes

bilan_na <- propre |>
  summarise(across(
    c(starts_with("temp_"), precip_mm),
    ~ sum(is.na(.x))
  ))
temp_min_c temp_max_c precip_mm
1 0 2

across() répète le calcul pour chaque colonne choisie.
Ici, .x désigne la colonne et sum(is.na(.x)) compte ses valeurs manquantes.

Ajouter une information avec left_join

avec_rive <- propre |>
  left_join(stations, by = "station",
            relationship = "many-to-one")

La table stations :

station rive
Québec nord
Lévis sud

La jointure ajoute la rive en associant les noms de stations.
Avec many-to-one, R s’arrête si une station correspond à plusieurs lignes de stations.

Une station absente de stations aura une rive manquante. Il faut aussi vérifier ce cas.

Passer au format long avec pivot_longer

long <- propre |>
  select(date, station, starts_with("temp_")) |>
  pivot_longer(
    cols = starts_with("temp_"),
    names_to = "mesure", values_to = "temp_c"
  )

Québec, le 1er septembre :

Mesure Température °C
temp_min_c 8.2
temp_max_c 18.5

Les colonnes date et station sont répétées pour les deux mesures.

Chaque température occupe maintenant une ligne.
mesure indique s’il s’agit du minimum ou du maximum; temp_c contient la valeur.

Comparer les moyennes des deux stations

Calculons la pluie moyenne pour chaque station, en excluant les valeurs manquantes.

classement <- propre |>
  filter(!is.na(precip_mm)) |>
  summarise(n_mesures = n(),
            pluie_moy = mean(precip_mm),
            .by = station) |>
  arrange(desc(pluie_moy))
Station Mesures Moy. mm
Lévis 3 4.0
Québec 1 1.5

.by = station fait le calcul séparément pour chaque station.
Ce regroupement s’applique seulement à cet appel de summarise().

Attention : la moyenne de Québec repose sur un seul jour, celle de Lévis sur trois jours.

Défi 1 : mercredi 30 septembre

PLT-3928 · Travail individuel · 60 minutes · 10 % de la note finale

Heure Déroulement
13 h 30 à 14 h 30 Travail individuel sur un poste Windows, sans Internet.
À 14 h 30 Vous enregistrez vos fichiers et vous arrêtez de travailler.
14 h 30 à 14 h 45 Je récupère vos dossiers de travail.
Ensuite Introduction aux graphiques sur un autre exemple.

Pas de mini-test la semaine du 30 septembre.

Ce que vous aurez à faire

Dans le script

  1. Lire le fichier et examiner les données.
  2. Corriger les textes, traiter les valeurs manquantes et retirer les doublons.
  3. Créer une variable, compter et calculer une proportion par groupe.
  4. Ajouter au moins cinq vérifications dans le code, puis enregistrer les résultats.

Les fichiers à enregistrer

  • Le fichier brut, sans le modifier.
  • Le script R/defi1.R.
  • Deux fichiers CSV dans data/processed/ : les données nettoyées et le résumé.
  • Un README d’environ 8 à 12 lignes.

Le README explique comment exécuter le script, vos choix de nettoyage et une limite.
La consigne complète et les données seront fournies au début du défi.

Ce que vous pouvez consulter

Documents permis

  • Vos documents papier.
  • Les notes et documents que je déposerai sur le compte d’examen.
  • L’aide de R et des packages installés sur le poste.

Pendant le défi, il est interdit de…

  • importer vos propres fichiers;
  • consulter Internet ou vos comptes personnels;
  • utiliser une IA, même pour comprendre une erreur;
  • échanger des réponses ou vous faire aider pour réaliser le travail.

À la fin du défi

  1. Avant la fin, redémarrez R et exécutez votre script du début à la fin.
  2. Vérifiez que le script, le README et les deux fichiers de résultats sont enregistrés dans le dossier defi-1, avec le fichier brut.
  3. À 14 h 30, enregistrez une dernière fois et arrêtez de modifier vos réponses.
  4. Attendez que je confirme la récupération de votre dossier avant de fermer la session.

Vous n’avez rien à envoyer : je récupère les fichiers sur votre compte.
Vous n’avez pas à utiliser Git ni à créer une archive ZIP.

Si vous avez un problème pour enregistrer vos fichiers, prévenez-moi tout de suite.

Comment le défi sera évalué

Critère Points
Exactitude technique 4
Reproductibilité 2
Qualité du code 2
Documentation et remise 1
Validation et explication 1
Total 10

Le travail et le barème sont les mêmes pour STT-4230 et STT-6230.
Vous devez expliquer au moins un de vos choix de nettoyage dans le README.

Vous pouvez utiliser R de base ou les packages vus en classe.
Vous n’avez pas à produire de graphique ou de rapport Quarto, ni à écrire vos propres fonctions.

Quoi pratiquer cette semaine

Exercices de prétraitement

  • Refaites sans IA un exercice complet : lire un fichier, nettoyer les données, les vérifier et enregistrer le résultat.
  • Calculez une proportion et expliquez ce que vous comptez au numérateur et au dénominateur.
  • Ajoutez une erreur dans une copie des données et vérifiez que votre script la détecte.
  • Exercez-vous à consulter l’aide de R. Préparez les documents papier que vous voulez apporter.

Pour le portfolio, conservez votre exemple de cette semaine dans semaines/semaine-04/, avec quelques lignes pour expliquer ce que vous avez fait et vérifié.

Pour préparer le défi 1

Sur le site du cours :

Documentation utile

Le script demonstration-semaine-04.R reproduit tous les exemples et vérifie les résultats.

R 4.1 ou plus; dplyr 1.1.1 ou plus; readr, tidyr, stringr, lubridate et tibble.