R Language
Tabelgegevens lezen en schrijven in platte tekstbestanden (CSV, TSV, enz.)
Zoeken…
Syntaxis
read.csv (bestand, kop = WAAR, sep = ",", quote = "" ", dec =". ", fill = WAAR, comment.char =" ", ...)
read.csv2 (bestand, kop = WAAR, sep = ";", quote = "" ", dec =", ", fill = WAAR, 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 , voortgang = interactief ())
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, selecteer = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # default:" integer64 "dec = if (sep! =" . ")". "else", ", col.names, check.names = FALSE, encoding =" onbekend ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # default: TRUE data. table = getOption ("datatable.fread.datatable") # default: TRUE)
parameters
| Parameter | Details |
|---|---|
| het dossier | naam van het te lezen CSV-bestand |
| hoofd | logisch: bevat het .csv-bestand een koprij met kolomnamen? |
| september | karakter: symbool dat de cellen op elke rij scheidt |
| citaat | karakter: symbool dat wordt gebruikt om tekenreeksen te citeren |
| december | karakter: symbool gebruikt als decimaal scheidingsteken |
| vullen | logisch: wanneer WAAR, worden rijen met ongelijke lengte gevuld met lege velden. |
| comment.char | character: karakter gebruikt als commentaar in het csv-bestand. Lijnen voorafgegaan door dit karakter worden genegeerd. |
| ... | extra argumenten die moeten worden doorgegeven aan read.table |
Opmerkingen
Merk op dat het exporteren naar een tekst zonder opmaak veel van de in de gegevens gecodeerde informatie opslaat, zoals variabele klassen omwille van brede draagbaarheid. Voor gevallen die dergelijke portabiliteit niet vereisen, kan een indeling zoals .RData of Feather nuttiger zijn.
Input / output voor andere soorten bestanden wordt behandeld in verschillende andere onderwerpen, allemaal gelinkt vanuit Input en output .
CSV-bestanden importeren
Importeren met base R
Door komma's gescheiden waardebestanden (CSV's) kunnen worden geïmporteerd met read.csv , waarmee read.table wordt read.table , maar sep = "," gebruikt om het scheidingsteken in te stellen op een komma.
# 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
Een gebruiksvriendelijke optie, file.choose , maakt het mogelijk om door de mappen te bladeren:
df <- read.csv(file.choose())
Notes
- In tegenstelling tot
read.table, staatread.csvstandaardheader = TRUEen gebruikt de eerste rij als kolomnamen. - Al deze functies zullen standaard strings naar
factorklasse converteren, tenzijas.is = TRUEofstringsAsFactors = FALSE. - De variant
read.csv2standaard ingesteld opsep = ";"endec = ","voor gebruik in gegevens uit landen waar de komma wordt gebruikt als een decimale punt en de puntkomma als een veldscheidingsteken.
Importeren met behulp van pakketten
De readr pakket's read_csv functie biedt veel snellere prestaties, een voortgangsbalk voor grote bestanden, en nog veel meer populaire standaard opties dan de standaard read.csv , waaronder 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
Importeren met data.table
Het data.table pakket introduceert de functie fread . Hoewel het vergelijkbaar is met read.table , is fread meestal sneller en flexibeler, waarbij het scheidingsteken van het bestand automatisch wordt geraden.
# 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
Waar argument input is een tekenreeks die:
- de bestandsnaam ( bijv.
"filename.csv"), - een shell-opdracht die op een bestand werkt ( bijvoorbeeld
"grep 'word' filename"), of - de invoer zelf ( bijvoorbeeld
"input1, input2 \n A, B \n C, D").
fread retourneert een object van class data.table dat data.table van class data.frame , geschikt voor gebruik met het gebruik van de data.table van [] . Om een gewoon data.frame te retourneren, stelt u de parameter data.table op 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
Notes
-
freadheeft niet alle dezelfde opties alsread.table. Een ontbrekend argument isna.comment, wat kan leiden tot ongewenst gedrag als het bronbestand#bevat. -
freadgebruikt alleen"voorquoteparameterquote. -
freadgebruikt enkele (5) lijnen om variabeltypes te raden.
.Tsv-bestanden als matrices importeren (basis R)
Veel mensen maken geen gebruik van file.path bij het maken van een pad naar een bestand. Maar als u op Windows-, Mac- en Linux-machines werkt, is het meestal een goede gewoonte om het te gebruiken voor het maken van paden in plaats van paste .
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Over het algemeen is dit voldoende voor de meeste mensen.
Soms gebeurt het dat de matrixafmetingen zo groot zijn dat bij het lezen in de matrix rekening moet worden gehouden met de procedure voor geheugentoewijzing, wat betekent dat de regel regel voor regel moet worden gelezen.
Neem het vorige voorbeeld, in dit geval bevat FilePath een bestand met dimensie 8970 8970 waarbij 79% van de cellen niet-nulwaarden bevat.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time zegt dat 267 seconden zijn genomen om het bestand te lezen.
user system elapsed
265.563 1.949 267.563
Op dezelfde manier kan dit bestand regel voor regel worden gelezen,
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
Er is ook het futile.matrix pakket dat een read.matrix methode implementeert, de code zelf zal hetzelfde zijn als beschreven in voorbeeld 1.
CSV-bestanden exporteren
Exporteren met base R
Gegevens kunnen naar een CSV-bestand worden geschreven met write.csv() :
write.csv(mtcars, "mtcars.csv")
Veelgebruikte parameters zijn row.names = FALSE en na = "" .
Exporteren met behulp van pakketten
readr::write_csv is aanzienlijk sneller dan write.csv en schrijft geen write.csv .
library(readr)
write_csv(mtcars, "mtcars.csv")
Meerdere csv-bestanden importeren
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Hiermee wordt elk bestand gelezen en aan een lijst toegevoegd. Nadien, als alle data.frame dezelfde structuur hebben, kunnen ze worden gecombineerd tot één groot data.frame:
df <- do.call(rbind, data_list)
Bestanden met vaste breedte importeren
Vaste breedte zijn tekstbestanden waarin kolommen niet gescheiden door een karakter scheidingsteken, zoals , of ; , maar hebben liever een vaste tekenlengte ( breedte ). Gegevens worden meestal opgevuld met witte spaties.
Een voorbeeld:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Laten we aannemen dat deze gegevenstabel bestaat in het lokale bestand constants.txt in de werkmap.
Importeren met basis 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
Notitie:
- Kolomtitels hoeven niet te worden gescheiden door een teken (
Column4Column5) - De
widthsparameter definieert de breedte van elke kolom - Niet-gescheiden headers zijn niet leesbaar met
read.fwf()
Importeren met 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
Notitie:
- readr's
fwf_*helperfuncties bieden alternatieve manieren om kolomlengtes op te geven, inclusief automatisch raden (fwf_empty) - readr is sneller dan base R
- Kolomtitels kunnen niet automatisch uit het gegevensbestand worden geïmporteerd