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.csvdéfautheader = TRUEet utilise la première ligne comme nom de colonne. - Toutes ces fonctions convertissent les chaînes en classes de
factorpar défaut, sauf sias.is = TRUEoustringsAsFactors = FALSE. - La variante
read.csv2dé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
-
freadn'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#. -
freadutilise uniquement"pour le paramètre dequote. -
freadutilise 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
widthsdé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_emptyautomatique (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