R Language
Lettura e scrittura di dati tabulari in file di testo semplice (CSV, TSV, ecc.)
Ricerca…
Sintassi
read.csv (file, header = TRUE, sep = "," quote = "" ", dec =". ", fill = TRUE, comment.char =" ", ...)
read.csv2 (file, header = TRUE, sep = ";", quote = "" ", dec =", ", fill = TRUE, comment.char =" ", ...)
readr :: read_csv (file, col_names = TRUE, col_types = NULL, locale = default_locale (), na = c ("", "NA"), comment = "", trim_ws = TRUE, skip = 0, n_max = -1 , progresso = interactive ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", stringsAsFactors = FALSE, verbose = getOption ("datatable .verbose "), autostart = 1L, skip = 0L, select = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # default:" integer64 "dec = if (sep! =" . ")". "else", ", col.names, check.names = FALSE, encoding =" unknown ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # default: TRUE data. table = getOption ("datatable.fread.datatable") # default: TRUE)
Parametri
| Parametro | Dettagli |
|---|---|
| file | nome del file CSV da leggere |
| intestazione | logico: il file .csv contiene una riga di intestazione con nomi di colonne? |
| settembre | carattere: simbolo che separa le celle su ogni riga |
| citazione | carattere: simbolo usato per citare stringhe di caratteri |
| dicembre | carattere: simbolo usato come separatore decimale |
| riempire | logico: quando TRUE, le righe con lunghezza diversa vengono riempite con campi vuoti. |
| comment.char | carattere: carattere usato come commento nel file csv. Le righe precedute da questo carattere vengono ignorate. |
| ... | argomenti extra da passare a read.table |
Osservazioni
Si noti che l'esportazione in un formato di testo normale sacrifica gran parte delle informazioni codificate nei dati come le classi variabili per motivi di ampia portabilità. Per i casi che non richiedono tale portabilità, un formato come .RData o Feather può essere più utile.
Input / output per altri tipi di file è trattato in diversi altri argomenti, tutti collegati da Input e output .
Importazione di file .csv
Importare usando la base R
I file di valori separati da virgola (CSV) possono essere importati usando read.csv , che read.table , ma usa sep = "," per impostare il delimitatore su una virgola.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
df <- read.csv(csv_path)
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Un'opzione user-friendly, file.choose , consente di navigare tra le directory:
df <- read.csv(file.choose())
Gli appunti
- A differenza di
read.table,read.csvdefaults toheader = TRUEe utilizza la prima riga come nomi di colonne. - Tutte queste funzioni convertiranno le stringhe in base alla classe di
factorper impostazione predefinita a meno cheas.is = TRUEostringsAsFactors = FALSE. - La variante
read.csv2valore predefinitosep = ";"edec = ","per l'uso su dati provenienti da paesi in cui la virgola viene utilizzata come punto decimale e il punto e virgola come separatore di campo.
Importare usando i pacchetti
La funzione readr pacchetto read_csv offre prestazioni molto più veloci, una barra di avanzamento per file di grandi dimensioni e opzioni predefinite più popolari rispetto a read.csv standard, inclusi stringsAsFactors = FALSE .
library(readr)
df <- read_csv(csv_path)
df
## # A tibble: 4 x 2
## Var1 Var2
## <dbl> <chr>
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Importazione con data.table
Il data.table pacchetto introduce la funzione fread . Mentre è simile a read.table , fread è solitamente più veloce e più flessibile, indovinare automaticamente delimitatore del file.
# get the file path of a CSV included in R's utils package
csv_path <- system.file("misc", "exDIF.csv", package = "utils")
# path will vary based on R installation location
csv_path
## [1] "/Library/Frameworks/R.framework/Resources/library/utils/misc/exDIF.csv"
dt <- fread(csv_path)
dt
## Var1 Var2
## 1: 2.70 A
## 2: 3.14 B
## 3: 10.00 A
## 4: -7.00 A
Dove l'argomento input è una stringa che rappresenta:
- il nome del file ( es.
"filename.csv"), - un comando shell che agisce su un file ( ad es.
"grep 'word' filename"), o - l'input stesso ( ad es.
"input1, input2 \n A, B \n C, D").
fread restituisce un oggetto di classe data.table che eredita dalla classe data.frame , adatto all'uso con l'utilizzo di [] . [] data.table. Per restituire un comune data.frame, impostare il parametro data.table su FALSE :
df <- fread(csv_path, data.table = FALSE)
class(df)
## [1] "data.frame"
df
## Var1 Var2
## 1 2.70 A
## 2 3.14 B
## 3 10.00 A
## 4 -7.00 A
Gli appunti
-
freadnon ha tutte le stesse opzioni diread.table. Un argomento mancante èna.comment, che può portare a comportamenti indesiderati se il file sorgente contiene#. -
freadusa solo"per il parametroquote. -
freadusa poche (5) linee per indovinare i tipi di variabili.
Importazione di file .tsv come matrici (base R)
Molte persone non fanno uso di file.path quando fanno il percorso di un file. Ma se si lavora su macchine Windows, Mac e Linux è di solito una buona pratica utilizzarlo per creare percorsi invece di paste .
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Generalmente questo è sufficiente per la maggior parte delle persone.
A volte capita che le dimensioni della matrice siano così grandi che la procedura di allocazione della memoria deve essere presa in considerazione durante la lettura nella matrice, il che significa leggere la matrice riga per riga.
Prendiamo l'esempio precedente. In questo caso FilePath contiene un file di dimensione 8970 8970 con il 79% delle celle contenenti valori diversi da zero.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time dice che sono stati presi 267 secondi per leggere il file.
user system elapsed
265.563 1.949 267.563
Allo stesso modo questo file può essere letto riga per riga,
FilePath <- "SomeFile"
connection<- gzfile(FilePath,open="r")
TableList <- list()
Counter <- 1
system.time(expr= while ( length( Vector<-as.matrix(scan(file=connection, sep=" ", nlines=1, quiet=TRUE)) ) > 0 ) {
TableList[[Counter]]<-Vector
Counter<-Counter+1
})
user system elapsed
165.976 0.060 165.941
close(connection)
system.time(expr=(Data <- do.call(rbind,TableList)))
user system elapsed
0.477 0.088 0.565
C'è anche il pacchetto futile.matrix che implementa un metodo read.matrix , il codice stesso si rivelerà essere la stessa cosa descritta nell'esempio 1.
Esportazione di file .csv
Esportare usando la base R
I dati possono essere scritti in un file CSV usando write.csv() :
write.csv(mtcars, "mtcars.csv")
I parametri più row.names = FALSE includono row.names = FALSE e na = "" .
Esportare usando i pacchetti
readr::write_csv è significativamente più veloce di write.csv e non scrive nomi di righe.
library(readr)
write_csv(mtcars, "mtcars.csv")
Importa più file CSV
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Questo legge ogni file e lo aggiunge a un elenco. Successivamente, se tutti i data.frame hanno la stessa struttura, possono essere combinati in un unico grande data.frame:
df <- do.call(rbind, data_list)
Importazione di file a larghezza fissa
I file a larghezza fissa sono file di testo in cui le colonne non sono separate da alcun delimitatore di caratteri, come , o ; , ma piuttosto hanno una lunghezza di carattere fissa ( larghezza ). I dati sono solitamente riempiti con spazi bianchi.
Un esempio:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Supponiamo che questa tabella di dati esista nel file locale constants.txt nella directory di lavoro.
Importazione con base R
df <- read.fwf('constants.txt', widths = c(8,10,18,7,8), header = FALSE, skip = 1)
df
#> V1 V2 V3 V4 V5
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42 42.0000
Nota:
- I titoli delle colonne non devono essere separati da un personaggio (
Column4Column5) - Il parametro
widthsdefinisce la larghezza di ogni colonna - Le intestazioni non separate non sono leggibili con
read.fwf()
Importare con readr
library(readr)
df <- read_fwf('constants.txt',
fwf_cols(Year = 8, Name = 10, Importance = 18, Value = 7, Doubled = 8),
skip = 1)
df
#> # A tibble: 3 x 5
#> Year Name Importance Value Doubled
#> <int> <chr> <chr> <dbl> <dbl>
#> 1 1647 pi 'important' 3.14159 6.28318
#> 2 1731 euler 'quite important' 2.71828 5.43656
#> 3 1979 answer 'The Answer.' 42.00000 42.00000
Nota:
- Le funzioni di supporto
fwf_*offrono metodi alternativi per specificare le lunghezze delle colonne, inclusa lafwf_emptyautomatica (fwf_empty) - readr è più veloce della base R
- I titoli delle colonne non possono essere automaticamente importati dal file di dati