R Language
Lecture et écriture de données tabulaires dans des fichiers en texte brut (CSV, TSV, etc.)
Recherche…
Syntaxe
read.csv (fichier, header = TRUE, sep = ",", quote = "" ", dec =". ", fill = TRUE, comment.char =" ", ...)
read.csv2 (fichier, header = TRUE, sep = ";", quote = "" ", dec =", ", fill = TRUE, comment.char =" ", ...)
readr :: read_csv (fichier, col_names = TRUE, col_types = NULL, locale = default_locale (), na = c ("", "NA"), comment = "", trim_ws = TRUE, saut = 0, n_max = -1 , progress = interactive ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", stringsAsFactors = FALSE, verbose = getOption ("datatable .verbose "), autostart = 1L, sauter = 0L, sélectionner = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # valeur par défaut:" integer64 "dec = if (sep! =" . ")". "else", ", col.names, check.names = FALSE, encoding =" unknown ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # valeur par défaut: données TRUE. table = getOption ("datatable.fread.datatable") # valeur par défaut: TRUE)
Paramètres
Paramètre | Détails |
---|---|
fichier | nom du fichier CSV à lire |
entête | Logique: le fichier .csv contient-il une ligne d'en-tête avec des noms de colonne? |
sep | caractère: symbole qui sépare les cellules de chaque ligne |
citation | caractère: symbole utilisé pour citer des chaînes de caractères |
déc | caractère: symbole utilisé comme séparateur décimal |
remplir | logical: lorsque TRUE, les lignes de longueur inégale sont remplies de champs vides. |
comment.char | character: caractère utilisé comme commentaire dans le fichier csv. Les lignes précédées de ce caractère sont ignorées. |
... | arguments supplémentaires à transmettre à read.table |
Remarques
Notez que l'exportation vers un format texte brut sacrifie une grande partie des informations encodées dans les données, telles que les classes de variables, dans un souci de portabilité étendue. Pour les cas qui ne nécessitent pas une telle portabilité, un format tel que .RData ou Feather peut être plus utile.
Les entrées / sorties pour les autres types de fichiers sont traitées dans plusieurs autres rubriques, toutes liées entre les entrées et les sorties .
Importer des fichiers .csv
Importer en utilisant la base R
Les fichiers de valeurs séparées par des virgules (CSV) peuvent être importés à l'aide de read.csv
, qui read.table
, mais utilise sep = ","
pour définir le séparateur comme une virgule.
# 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
Une option conviviale, file.choose
, permet de parcourir les répertoires:
df <- read.csv(file.choose())
Remarques
- Contrairement à
read.table
,read.csv
défautheader = TRUE
et utilise la première ligne comme nom de colonne. - Toutes ces fonctions convertissent les chaînes en classes de
factor
par défaut, sauf sias.is = TRUE
oustringsAsFactors = FALSE
. - La variante
read.csv2
défautsep = ";"
etdec = ","
à utiliser sur les données de pays où la virgule est utilisée comme point décimal et le point-virgule comme séparateur de champ.
Importer en utilisant des paquets
La fonction readr
paquet read_csv
offre des performances beaucoup plus rapides, une barre de progression pour les fichiers volumineux et des options par défaut plus répandues que le read.csv
standard, y compris 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
Importer avec data.table
Le package data.table
introduit la fonction fread
. Bien qu'il soit similaire à read.table
, fread
est généralement plus rapide et plus flexible, devinant automatiquement le délimiteur du fichier.
# 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
Où input
argument est une chaîne représentant:
- le nom de fichier ( par exemple
"filename.csv"
), - une commande shell qui agit sur un fichier ( par exemple
"grep 'word' filename"
), ou - l'entrée elle-même ( par exemple
"input1, input2 \n A, B \n C, D"
).
fread
renvoie un objet de classe data.table
qui hérite de la classe data.frame
, utilisable avec l'utilisation de []
par data.table. Pour retourner un data.frame ordinaire, définissez le paramètre data.table
sur 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
Remarques
-
fread
n'a pas toutes les mêmes options queread.table
. Un argument manquant estna.comment
, ce qui peut entraîner des comportements indésirables si le fichier source contient#
. -
fread
utilise uniquement"
pour le paramètre dequote
. -
fread
utilise peu (5) lignes pour deviner les types de variables.
Importer des fichiers .tsv en tant que matrices (basic R)
De nombreuses personnes n'utilisent pas file.path
lors de la création d'un chemin vers un fichier. Mais si vous travaillez sur des machines Windows, Mac et Linux, il est généralement recommandé de l'utiliser pour créer des chemins plutôt que des paste
.
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
En général, cela est suffisant pour la plupart des gens.
Parfois, les dimensions de la matrice sont si importantes que la procédure d'allocation de la mémoire doit être prise en compte lors de la lecture dans la matrice, ce qui signifie lire la matrice ligne par ligne.
Prenons l'exemple précédent. Dans ce cas, FilePath
contient un fichier de dimension 8970 8970
avec 79% des cellules contenant des valeurs non nulles.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time
indique que 267 secondes ont été nécessaires pour lire le fichier.
user system elapsed
265.563 1.949 267.563
De même ce fichier peut être lu ligne par ligne,
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
Il y a aussi le paquet futile.matrix
qui implémente une méthode read.matrix
, le code lui-même se révélera être la même chose que celle décrite dans l'exemple 1.
Exportation de fichiers .csv
Exportation en utilisant la base R
Les données peuvent être écrites dans un fichier CSV en utilisant write.csv()
:
write.csv(mtcars, "mtcars.csv")
Les paramètres couramment spécifiés incluent row.names = FALSE
et na = ""
.
Exportation en utilisant des paquets
readr::write_csv
est nettement plus rapide que write.csv
et n'écrit pas les noms de lignes.
library(readr)
write_csv(mtcars, "mtcars.csv")
Importer plusieurs fichiers csv
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Cela lit chaque fichier et l'ajoute à une liste. Par la suite, si tous les data.frame ont la même structure, ils peuvent être combinés en un seul grand data.frame:
df <- do.call(rbind, data_list)
Importer des fichiers à largeur fixe
Les fichiers à largeur fixe sont des fichiers texte dans lesquels les colonnes ne sont séparées par aucun séparateur de caractères, comme ,
ou ;
, mais ont plutôt une longueur de caractère fixe ( largeur ). Les données sont généralement remplies d'espaces blancs.
Un exemple:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Supposons que cette table de données existe dans le fichier local constants.txt
du répertoire de travail.
Importer avec la 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
Remarque:
- Les titres de colonne n'ont pas besoin d'être séparés par un caractère (
Column4Column5
) - Le paramètre
widths
définit la largeur de chaque colonne - Les en-têtes non séparés ne sont pas lisibles avec
read.fwf()
Importer avec 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
Remarque:
- Les fonctions helper
fwf_*
offrent d'autres moyens de spécifier les longueurs de colonnes, y compris lafwf_empty
automatique (fwf_empty
) - readr est plus rapide que la base r
- Les titres de colonnes ne peuvent pas être importés automatiquement à partir d'un fichier de données