Des fichiers
aux objets R

Comprendre ce que l’on importe.
Savoir ce que l’on extrait.

Retour sur les lectures et le mini-test
Aurélien Nicosia · 9 septembre 2026

Trois lectures, trois questions

Lecture Question à garder en tête
Concepts de base en R Quel objet cette instruction crée-t-elle ?
Structures de données Que contient l’objet et comment y accéder ?
Lecture et écriture Quel objet obtient-on à partir du fichier ?

Aujourd’hui : prédire, exécuter, inspecter.

Baillargeon, notes STT-4230 / STT-6230 : bases, structures, fichiers.

Vos demandes pour le laboratoire

  1. Créer et manipuler un data frame.
  2. Importer des fichiers CSV et Excel.
  3. Comprendre l’indiçage des matrices et des arrays.

Nous reviendrons aussi sur les vecteurs et les facteurs.

Synthèse des réponses à la dernière question du mini-test, consultées le 9 septembre 2026.

Un nom, une valeur, un appel

n <- c(4L, 7L, 9L)
n
[1] 4 7 9
length(n)
[1] 3

n désigne l’objet en mémoire.

"n" est une chaîne de caractères.

length(n) appelle une fonction.

4L est un entier, 4 est un double.

str(n) donne un aperçu du contenu et de sa structure.

Les structures à reconnaître

Objet Organisation Types des éléments
Vecteur atomique Une suite de valeurs Un type commun
Matrice atomique Lignes et colonnes Un type commun
Array atomique Plusieurs dimensions Un type commun
Liste Des éléments, éventuellement imbriqués Types et longueurs variables
Data frame / tibble Des colonnes de même longueur Types possibles différents entre colonnes

Une matrice est un array à deux dimensions. Ici, les exemples de matrices et d’arrays sont atomiques.

Retour au mini-test : quel type ?

typeof(c(2L, 3.5, NA))

"integer" · "double" · "logical" · "list"

[1] "double"

c() combine ici les valeurs en un vecteur atomique.

Le double 3.5 impose une conversion commune. Le NA devient lui aussi un NA de type double.

Avec list(2L, 3.5, NA), chaque élément conserverait son type.

Le tableau de notre démonstration

mesures <- data.frame(
  site = c("QC-01", "LV-01", "QC-02"),
  n = c(4L, 7L, 9L),
  indice = c(2.5, 3.5, NA_real_)
)
site n indice
QC-01 4 2.5
LV-01 7 3.5
QC-02 9 NA

Données fictives pour trois sites de la région de Québec. n est un effectif, indice une mesure illustrative. NA indique une mesure manquante.

Une colonne : tableau ou vecteur ?

mesures["n"]
mesures[["n"]]
mesures[, "n"]

Avant d’exécuter : ces trois résultats ont-ils la même classe ?

Expression Classe Résultat
mesures["n"] data.frame Tableau de 3 lignes et 1 colonne
mesures[["n"]] integer Vecteur de longueur 3
mesures[, "n"] integer Vecteur de longueur 3

Des lignes et des colonnes

Les sites dont l’effectif est au moins 7, avec leur indice :

mesures[mesures$n >= 7, c("site", "indice"), drop = FALSE]
site indice
LV-01 3.5
QC-02 NA

[ lignes, colonnes ]

drop = FALSE conserve une structure de tableau.

Matrice : l’ordre des indices

mat <- matrix(1:6, nrow = 2)
mat
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Que renvoie mat[2, 3] ?

mat[2, 3]
[1] 6

Ligne 2, colonne 3.

mat[, 2] extrait la colonne en vecteur.
mat[, 2, drop = FALSE] garde une matrice.

Un fichier CSV, une convention à lire

Contenu de notre fichier mesures.csv :

site;n;indice
QC-01;4;2,5
LV-01;7;3,5
QC-02;9;.

Trois détails à repérer avant l’importation :

  • Le séparateur de colonnes est ;.
  • Le séparateur décimal est ,.
  • Le point . représente ici une donnée manquante.

CSV : rendre la lecture explicite

import_base <- read.csv2(
  fichier_csv,
  na.strings = "."
)
str(import_base)
'data.frame':   3 obs. of  3 variables:
 $ site  : chr  "QC-01" "LV-01" "QC-02"
 $ n     : int  4 7 9
 $ indice: num  2.5 3.5 NA

read.csv2() utilise sep = ";" et dec = ",".
Le résultat est un data frame.

La même lecture avec readr

library(readr)
import_tibble <- read_csv2(
  fichier_csv,
  na = ".",
  col_types = cols(
    site = col_character(),
    n = col_integer(),
    indice = col_double()
  )
)

Même convention de fichier, types déclarés, résultat sous forme de tibble.

readr : lecture de fichiers délimités, documentation consultée le 9 septembre 2026.

Excel : quelle feuille, quels types ?

library(readxl)
excel_sheets(fichier_excel)
[1] "mesures"
import_excel <- read_excel(
  fichier_excel,
  sheet = "mesures",
  col_types = c("text", "numeric", "numeric")
)

Le classeur contient des feuilles. La feuille lue devient un objet R.

readxl : read_excel, documentation consultée le 9 septembre 2026.

Après Excel : le même réflexe

class(import_excel)
[1] "tbl_df"     "tbl"        "data.frame"
Expression Classe Résultat
import_excel[, "n"] tbl_df, tbl, data.frame Tibble de 3 lignes et 1 colonne
import_excel[["n"]] numeric Vecteur de longueur 3

Pour extraire les valeurs d’une colonne : [["n"]] ou $n.

Un import réussi suffit-il ?

import_incomplet <- read.csv2(fichier_csv)
str(import_incomplet$indice)
 chr [1:3] "2,5" "3,5" "."

Pourquoi indice contient-il du texte ? Que faut-il changer ?

Le . n’a pas été déclaré comme valeur manquante.

import_corrige <- read.csv2(fichier_csv, na.strings = ".")
str(import_corrige$indice)
 num [1:3] 2.5 3.5 NA

Sauvegarder un objet R

saveRDS(import_corrige, fichier_rds)
copie <- readRDS(fichier_rds)
identical(import_corrige, copie)
[1] TRUE
Besoin Format possible
Échanger une table de valeurs CSV
Échanger un classeur avec des feuilles Excel
Retrouver un objet R et ses attributs RDS

À vous de jouer

Sur votre premier fichier du laboratoire :

  1. Prévoir les colonnes et leurs types.
  2. Importer, puis vérifier avec str() et head().
  3. Extraire une colonne en vecteur et en tableau.

Expliquer une surprise et sa correction.

Ouvrir les exercices « Structures et fichiers »

Compléments disponibles : array, facteurs, listes.

Array : un indice par dimension

comptages <- array(
  1:12, dim = c(2, 3, 2),
  dimnames = list(site = c("A", "B"),
                  jour = c("lun", "mar", "mer"),
                  semaine = c("s1", "s2"))
)
comptages[, , "s2"]
    jour
site lun mar mer
   A   7   9  11
   B   8  10  12

comptages["B", "mar", "s2"] vaut 10.
Site B, mardi, semaine 2.

Facteurs : valeurs et niveaux

secteur <- factor(c("urbain", "rural", "urbain"),
                  levels = c("rural", "urbain", "forestier"))
levels(secteur)
[1] "rural"     "urbain"    "forestier"
as.integer(secteur)
[1] 2 1 2

Les entiers sont des codes de niveaux.
Ils ne mesurent pas la quantité de « secteur ».

Une conversion trompeuse

valeurs <- factor(c("10", "20", "10"))
as.numeric(valeurs)
[1] 1 2 1

Que faudrait-il faire pour récupérer les nombres 10 et 20 ?

as.numeric(as.character(valeurs))
[1] 10 20 10

Cette conversion convient ici, car les étiquettes sont numériques.

Liste : le contenant et son contenu

sortie <- list(donnees = mesures, note = "Exemple fictif")

sortie["donnees"]

Une liste contenant un élément.

length(sortie["donnees"]) vaut 1.

sortie[["donnees"]]

Le data frame lui-même.

nrow(sortie[["donnees"]]) vaut 3.

[ conserve une sous-liste. [[ extrait un élément.

Pour revenir aux explications

Support adapté des exemples de la semaine 2 conservés dans le site Brio de l’automne 2025. Documentation consultée le 9 septembre 2026.