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 to header = 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 che as.is = TRUE o stringsAsFactors = FALSE .
  • La variante read.csv2 valore predefinito sep = ";" e dec = "," 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 di read.table . Un argomento mancante è na.comment , che può portare a comportamenti indesiderati se il file sorgente contiene # .
  • fread usa solo " per il parametro quote .
  • 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 la fwf_empty automatica ( fwf_empty )
  • readr è più veloce della base R
  • I titoli delle colonne non possono essere automaticamente importati dal file di dati


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow