Menu

Leggere file CSV in R (read.csv e read_csv)

Come importare file CSV in R con read.csv(): gli argomenti che contano, il tranello della directory di lavoro che causa la maggior parte degli errori e quando conviene readr::read_csv.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

read.csv() trasforma un file CSV in un data frame

Leggere un CSV in R richiede una sola chiamata di funzione, integrata nel linguaggio, senza nessun pacchetto:

sales <- read.csv("sales.csv")

read.csv() legge il file, usa la prima riga come nomi delle colonne, deduce un tipo per ogni colonna e restituisce un data frame. Per un file ben fatto, non c'è altro da sapere.

Puoi vederla all'opera anche senza un file, perché read.csv() accetta anche testo CSV grezzo tramite l'argomento text: lo stesso parser, a cui passi una stringa invece del nome di un file:

str() è la prima cosa da eseguire su qualsiasi cosa importi: mostra ogni colonna con il tipo dedotto. Qui name è arrivata come carattere, score come intero, passed come logico, tutto dedotto dai valori. Per un rapido controllo visivo, head(students) mostra le prime righe e nrow(students) le conta. Se una colonna che ti aspettavi numerica compare come chr, qualcosa in quella colonna non è un numero (un commento vagante, un "N/A", un separatore delle migliaia) ed è quello il momento di sistemarlo, non tre grafici dopo.

Gli argomenti che contano

read.csv() ha decine di parametri; ne userai circa cinque.

header: indica se la prima riga contiene i nomi delle colonne. Il default è TRUE. Se il tuo file inizia direttamente con i dati, passa header = FALSE e R chiamerà le colonne V1, V2, ...

sep: il separatore dei campi, di default ",". In gran parte d'Europa i CSV usano il punto e virgola come separatore, perché lì la virgola è il separatore decimale. R include una variante già configurata proprio per questo: read.csv2() usa sep = ";" e dec = ",":

Le altezze escono come numeri veri: read.csv2 sapeva che 1,63 significava uno virgola sessantatré. Se avessi usato la normale read.csv su questo file, avresti ottenuto un'unica colonna rovinata, perché niente divide correttamente su una virgola che in realtà è un decimale.

na.strings: quali stringhe contano come valori mancanti. Di default solo "NA" diventa un valore mancante. Gli export reali scrivono i dati mancanti come celle vuote, "missing", "-", "NULL", e se non li dichiari arrivano come testo e trascinano tutta la colonna a carattere:

Con il giusto na.strings, le celle vuote diventano veri NA e score resta numerica. Senza, "missing" è solo una parola e la colonna diventa testo.

skip: le righe da ignorare prima che inizino i dati. Gli export adorano mettere una o due righe di titolo sopra la tabella vera e propria; skip = 2 le salta.

colClasses: forza i tipi delle colonne invece di lasciarli dedurre a R. La vittima classica è tutto ciò che ha zeri iniziali, come CAP, numeri di telefono e codici prodotto, che R legge come numeri, cancellando gli zeri:

00501 è diventato 501. Il dato era corretto nel file e sbagliato in R, senza alcun avviso. colClasses = c("integer", "character") dice al parser che tipo è ogni colonna, nell'ordine, e gli zeri si salvano.

Un argomento che non ti serve più: stringsAsFactors. Per gran parte della storia di R, read.csv() convertiva ogni colonna di testo in un factor a meno che tu non dicessi il contrario, e questo ha causato un'enorme quantità di confusione. Da R 4.0 il default è FALSE: il testo resta testo. Vedrai ancora stringsAsFactors = FALSE sparso nei tutorial più vecchi; con una versione recente di R è innocuo ma superfluo.

Percorsi dei file: il motivo numero uno per cui read.csv fallisce

L'errore che ogni studente di R incontra nella prima settimana:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

Il file esiste: lo stai guardando nel tuo file manager. Ma R non sta cercando lì. Un semplice nome di file come "sales.csv" viene risolto rispetto alla directory di lavoro di R, che di solito non è la cartella in cui si trova il tuo file. Due righe fanno la diagnosi:

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

Se file.exists() dice FALSE, rieseguire non servirà a niente: sistema il percorso. Puoi indicare il percorso completo (read.csv("C:/Users/ada/data/sales.csv"): le barre normali funzionano anche su Windows e sono più sicure delle barre rovesciate) oppure spostare la directory di lavoro di R sulla cartella dei dati con setwd(). Cos'è la directory di lavoro, come la gestiscono i progetti e perché setwd() negli script è malvisto lo trovi in directory di lavoro.

Fai di file.exists() un riflesso. Trasforma un "misterioso errore di importazione" in un "refuso nel percorso" in un secondo.

Leggere un CSV direttamente da un URL

read.csv() accetta un URL ovunque accetti un nome di file, e scarica il file al posto tuo:

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

È comodo per tutorial e dataset pubblici: nessun passaggio di download, nessun problema di percorsi. Il prezzo è che il tuo script ora dipende dalla rete e dal fatto che quell'URL resti attivo; per tutto ciò che riesegui spesso, scaricalo una volta e leggi la copia locale.

readr::read_csv, l'alternativa più veloce e più loquace

Il tidyverse ha un suo lettore di CSV nel pacchetto readr: read_csv() (con il trattino basso, non il punto). Vale la pena conoscerlo perché la maggior parte del codice R moderno che leggerai lo usa:

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

Le differenze pratiche rispetto a read.csv():

  • Velocità: sensibilmente più veloce su file con centinaia di migliaia di righe.
  • Restituisce un tibble: un data frame modernizzato che stampa un'anteprima compatta invece di inondare la console.
  • Dichiara le sue deduzioni: dopo la lettura stampa il tipo rilevato per ogni colonna, così una colonna letta come carattere quando ti aspettavi numeri si vede subito invece di diventare una sorpresa più tardi.
  • Non storpia mai i nomi delle colonne: read.csv() riscrive un'intestazione come first name in first.name; read_csv() la lascia com'è.

Per un file piccolo va bene l'una o l'altra funzione. Scegli read_csv() quando i file diventano grandi o quando il resto del tuo script usa già il tidyverse. Tutto quello che hai visto sopra su percorsi, separatori (esiste anche read_csv2()) e stringhe per i valori mancanti (na =) vale ancora, con nomi degli argomenti leggermente diversi.

Quando hai finito l'analisi, il viaggio di ritorno, cioè esportare i risultati in un file, è write.csv.

Cosa ti porti a casa

  • df <- read.csv("file.csv") legge un CSV in un data frame; controllalo subito con str() e head().
  • read.csv(text = "...") analizza direttamente una stringa CSV: ottimo per esperimenti ed esempi piccoli.
  • Gli argomenti che si guadagnano il posto: header, sep (o read.csv2 per il punto e virgola), na.strings, skip, colClasses.
  • "Cannot open file" significa che la directory di lavoro non è dove pensi: getwd() e file.exists() chiariscono tutto all'istante.
  • readr::read_csv() è la versione tidyverse più veloce: tibble, tipi di colonna dichiarati, nomi intatti.

Prossimo passo: file che non sono affatto testo semplice, cioè leggere i fogli Excel con il pacchetto readxl.

Domande frequenti

Come si legge un file CSV in R?

Con read.csv("file.csv"): è integrata, non serve nessun pacchetto. Restituisce un data frame con una colonna per ogni colonna del CSV e usa la prima riga come nomi delle colonne. Assegna il risultato a una variabile, df <- read.csv("sales.csv"), poi controllalo con str(df) e head(df).

Perché read.csv dice 'cannot open file: No such file or directory'?

R cerca il file a partire dalla sua directory di lavoro, che probabilmente non è la cartella in cui si trova il tuo file. Esegui getwd() per vedere dove sta cercando R e file.exists("file.csv") per confermare che non lo trova. Risolvi con un percorso completo, oppure impostando la directory di lavoro sulla cartella del file.

Qual è la differenza tra read.csv e read_csv in R?

read.csv() fa parte di R base: è sempre disponibile e restituisce un normale data frame. read_csv() arriva dal pacchetto readr: è più veloce sui file grandi, restituisce un tibble, non tocca mai i nomi delle colonne e stampa i tipi di colonna che ha dedotto, così ti accorgi subito di una lettura sbagliata. Per file piccoli va bene l'una o l'altra; per file grandi o pipeline tidyverse, usa read_csv().

Come si legge un CSV separato da punto e virgola in R?

Usa read.csv2("file.csv"): è read.csv già configurata per la convenzione europea, con il punto e virgola come separatore e la virgola come separatore decimale. In alternativa passa sep = ";" (e dec = "," se serve) alla normale read.csv().

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA