read.csv() transforme un fichier CSV en data frame
Lire un CSV en R tient en un appel de fonction, intégré au langage - aucun package requis :
sales <- read.csv("sales.csv")
read.csv() lit le fichier, utilise la première ligne comme noms de colonnes, devine un type pour chaque colonne, et renvoie un data frame. C'est toute l'histoire pour un fichier bien élevé.
Tu peux le voir à l'œuvre sans aucun fichier, parce que read.csv() accepte aussi du texte CSV brut via l'argument text - le même analyseur, nourri d'une chaîne plutôt que d'un nom de fichier :
str() est la première chose à lancer sur tout ce que tu importes : il montre chaque colonne avec son type deviné. Ici name est arrivé en character, score en integer, passed en logical - tous devinés à partir des valeurs. Pour un contrôle visuel rapide, head(students) montre les premières lignes et nrow(students) les compte. Si une colonne que tu attendais numérique apparaît en chr, c'est que quelque chose dans cette colonne n'est pas un nombre - un commentaire égaré, un "N/A", un séparateur de milliers - et c'est le moment de corriger, pas trois graphiques plus tard.
Les arguments qui comptent
read.csv() a des dizaines de paramètres ; tu en utiliseras environ cinq.
header - si la première ligne contient les noms de colonnes. Vaut TRUE par défaut. Si ton fichier commence directement par des données, passe header = FALSE et R nomme les colonnes V1, V2, ...
sep - le séparateur de champs, "," par défaut. Une bonne partie de l'Europe écrit les CSV avec des points-virgules comme séparateurs, parce que la virgule y est la marque décimale. R livre une variante préconfigurée pour exactement ça : read.csv2() utilise sep = ";" et dec = "," :
Les tailles ressortent en vrais nombres - read.csv2 savait que 1,63 voulait dire un virgule soixante-trois. Si tu avais utilisé read.csv tout simple sur ce fichier, tu obtiendrais une colonne massacrée, parce que rien ne découpe correctement sur une virgule-qui-est-une-décimale.
na.strings - quelles chaînes comptent comme manquantes. Par défaut seul "NA" devient une valeur manquante. Les vrais exports écrivent les données manquantes sous forme de cellules vides, "missing", "-", "NULL" - et tant que tu ne les déclares pas, elles arrivent en texte et tirent toute la colonne vers character :
Avec les bons na.strings, les vides deviennent de vrais NA et score reste numérique. Sans ça, "missing" n'est qu'un mot, et la colonne est du texte.
skip - le nombre de lignes à ignorer avant le début des données. Les exports adorent poser une ou deux lignes de titre au-dessus du vrai tableau ; skip = 2 les enjambe.
colClasses - force les types de colonnes au lieu de laisser R deviner. La victime classique est tout ce qui a des zéros en tête - codes postaux, numéros de téléphone, identifiants produits - que le devineur de R lit comme des nombres, détruisant les zéros :
00501 est devenu 501. La donnée était correcte dans le fichier et fausse dans R, en silence. colClasses = c("integer", "character") dit à l'analyseur ce qu'est chaque colonne, dans l'ordre, et les zéros survivent.
Un argument dont tu n'as plus besoin : stringsAsFactors. Pendant la majeure partie de l'histoire de R, read.csv() convertissait chaque colonne texte en facteur sauf mention contraire, ce qui a causé énormément de confusion. Depuis R 4.0 la valeur par défaut est FALSE - le texte reste du texte. Tu verras encore stringsAsFactors = FALSE éparpillé dans les tutoriels plus anciens ; sur un R actuel c'est inoffensif mais redondant.
Les chemins de fichiers : la raison n°1 des échecs de read.csv
L'erreur que tout apprenant R rencontre dès la première semaine :
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory
Le fichier existe - tu le vois dans ton gestionnaire de fichiers. Mais R ne regarde pas là. Un nom de fichier nu comme "sales.csv" est résolu relativement au répertoire de travail de R, et ce n'est généralement pas le dossier où se trouve ton fichier. Deux lignes le diagnostiquent :
getwd() # where R is actually looking
file.exists("sales.csv") # FALSE means the path is wrong, full stop
Si file.exists() dit FALSE, relancer n'aidera jamais - corrige le chemin. Soit tu donnes le chemin complet (read.csv("C:/Users/ada/data/sales.csv") - les barres obliques marchent aussi sous Windows, et sont plus sûres que les antislashs), soit tu déplaces le répertoire de travail de R vers le dossier de données avec setwd(). Ce qu'est le répertoire de travail, comment les projets le gèrent, et pourquoi setwd() dans les scripts est mal vu, c'est traité dans le répertoire de travail.
Fais de file.exists() un réflexe. Ça transforme un « échec d'import mystérieux » en « faute de frappe dans un chemin » en une seconde.
Lire un CSV directement depuis une URL
read.csv() accepte une URL partout où il accepte un nom de fichier, et télécharge le fichier pour toi :
url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)
C'est pratique pour les tutoriels et les jeux de données publics - pas d'étape de téléchargement, pas de problème de chemin. La contrepartie, c'est que ton script dépend désormais du réseau et de la survie de cette URL ; pour tout ce que tu relanceras souvent, télécharge une fois et lis la copie locale.
readr::read_csv - l'alternative plus rapide et plus bavarde
Le tidyverse livre son propre lecteur de CSV dans le package readr : read_csv() (underscore, pas point). Il vaut la peine d'être connu parce que la plupart du code R moderne que tu liras l'utilise :
install.packages("readr") # once
library(readr) # every session
flights <- read_csv("flights.csv")
Les différences pratiques avec read.csv() :
- Vitesse - nettement plus rapide sur des fichiers de centaines de milliers de lignes.
- Il renvoie un tibble - un data frame modernisé qui affiche un aperçu compact au lieu d'inonder ta console.
- Il rapporte ses hypothèses - après lecture, il affiche le type détecté de chaque colonne, de sorte qu'une colonne analysée en character alors que tu attendais des nombres est visible immédiatement plutôt qu'une surprise plus tard.
- Il ne massacre jamais les noms de colonnes -
read.csv()réécrit un en-tête commefirst nameenfirst.name;read_csv()le laisse tel quel.
Pour un petit fichier, l'une ou l'autre convient. Passe à read_csv() quand les fichiers grossissent ou quand le reste de ton script est de toute façon du tidyverse. Tout ce qui précède sur les chemins, les séparateurs (read_csv2() existe aussi) et les chaînes de valeurs manquantes (na =) se transpose avec des noms d'arguments légèrement différents.
Quand ton analyse est terminée, le trajet de retour - exporter tes résultats vers un fichier - c'est write.csv.
Ce que tu retiens
df <- read.csv("file.csv")lit un CSV dans un data frame ; vérifie-le tout de suite avecstr()ethead().read.csv(text = "...")analyse directement une chaîne CSV - parfait pour les expériences et les petits exemples.- Les arguments qui gagnent leur place :
header,sep(ouread.csv2pour les points-virgules),na.strings,skip,colClasses. - « Cannot open file » signifie que le répertoire de travail n'est pas là où tu le crois -
getwd()etfile.exists()tranchent instantanément. readr::read_csv()est la version tidyverse plus rapide : tibbles, types de colonnes rapportés, noms intacts.
Prochaine étape : des fichiers qui ne sont pas du tout du texte brut - lire des feuilles de calcul Excel avec le package readxl.
Questions fréquentes
Comment lire un fichier CSV en R ?
Avec read.csv("file.csv") - c'est intégré, aucun package nécessaire. Il renvoie un data frame avec une colonne par colonne du CSV, en utilisant la première ligne comme noms de colonnes. Affecte le résultat à une variable : df <- read.csv("sales.csv"), puis vérifie avec str(df) et head(df).
Pourquoi read.csv dit-il « cannot open file: No such file or directory » ?
R cherche le fichier relativement à son répertoire de travail, qui n'est probablement pas le dossier où se trouve ton fichier. Lance getwd() pour voir où R regarde et file.exists("file.csv") pour confirmer l'échec. Corrige avec un chemin complet, ou en fixant le répertoire de travail au dossier du fichier.
Quelle est la différence entre read.csv et read_csv en R ?
read.csv() est du R de base - toujours disponible, renvoie un data frame ordinaire. read_csv() vient du package readr - il est plus rapide sur les gros fichiers, renvoie un tibble, ne touche jamais à tes noms de colonnes, et affiche les types de colonnes qu'il a devinés pour que tu repères tout de suite une mauvaise interprétation. Pour de petits fichiers l'un ou l'autre convient ; pour de gros fichiers ou des pipelines tidyverse, utilise read_csv().
Comment lire un CSV séparé par des points-virgules en R ?
Utilise read.csv2("file.csv") - c'est read.csv préconfiguré pour la convention européenne : point-virgule comme séparateur et virgule comme marque décimale. Ou passe sep = ";" (et dec = "," si besoin) à read.csv tout simple.