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.csv
standaardheader = TRUE
en gebruikt de eerste rij als kolomnamen. - Al deze functies zullen standaard strings naar
factor
klasse converteren, tenzijas.is = TRUE
ofstringsAsFactors = FALSE
. - De variant
read.csv2
standaard 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
-
fread
heeft niet alle dezelfde opties alsread.table
. Een ontbrekend argument isna.comment
, wat kan leiden tot ongewenst gedrag als het bronbestand#
bevat. -
fread
gebruikt alleen"
voorquote
parameterquote
. -
fread
gebruikt 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
widths
parameter 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