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.csv
defaults toheader = TRUE
e utilizza la prima riga come nomi di colonne. - Tutte queste funzioni convertiranno le stringhe in base alla classe di
factor
per impostazione predefinita a meno cheas.is = TRUE
ostringsAsFactors = FALSE
. - La variante
read.csv2
valore 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
-
fread
non ha tutte le stesse opzioni diread.table
. Un argomento mancante èna.comment
, che può portare a comportamenti indesiderati se il file sorgente contiene#
. -
fread
usa solo"
per il parametroquote
. -
fread
usa 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
widths
definisce 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_empty
automatica (fwf_empty
) - readr è più veloce della base R
- I titoli delle colonne non possono essere automaticamente importati dal file di dati