R Language
Lesen und Schreiben von Tabellendaten in Klartextdateien (CSV, TSV usw.)
Suche…
Syntax
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, überspringen = 0, n_max = -1 Fortschritt = interaktiv ())
data.table :: fread (input, sep = "auto", sep2 = "auto", nrows = -1L, header = "auto", na.strings = "NA", stringsAsFactors = FALSE, verbose = getOption ("datatable") .verbose "), autostart = 1L, überspringen = 0L, select = NULL, drop = NULL, colClasses = NULL, integer64 = getOption (" datatable.integer64 "), # default:" integer64 "dec = if (sep! =" . ")". "else", ", col.names, check.names = FALSE, Kodierung =" unbekannt ", strip.white = TRUE, showProgress = getOption (" datatable.showProgress "), # default: TRUE data. table = getOption ("datatable.fread.datatable") # default: TRUE
Parameter
| Parameter | Einzelheiten |
|---|---|
| Datei | Name der zu lesenden CSV-Datei |
| Header | logisch: Enthält die CSV-Datei eine Kopfzeile mit Spaltennamen? |
| sep | Zeichen: Symbol, das die Zellen in jeder Zeile trennt |
| Zitat | Zeichen: Symbol für Anführungszeichen |
| dez | Zeichen: Symbol als Dezimaltrennzeichen |
| füllen | logisch: Bei TRUE werden Zeilen mit ungleicher Länge mit leeren Feldern gefüllt. |
| comment.char | Zeichen: Zeichen, das als Kommentar in der CSV-Datei verwendet wird. Zeilen, denen dieses Zeichen vorangestellt ist, werden ignoriert. |
| ... | zusätzliche Argumente, die an read.table |
Bemerkungen
Beachten Sie, dass beim Exportieren in ein Nur-Text-Format ein Großteil der in den Daten codierten Informationen, wie z. B. Variablenklassen, aus Gründen der großen Portabilität geopfert wird. In Fällen, in denen eine solche Portabilität nicht erforderlich ist, kann ein Format wie .RData oder Feather sinnvoller sein.
Die Eingabe / Ausgabe für andere Dateitypen wird in mehreren anderen Themen behandelt, die alle mit Eingabe und Ausgabe verknüpft sind.
.Csv-Dateien importieren
Import mit Basis R
Comma-Separated-Value-Dateien (CSVs) können mit read.csv importiert werden. Dabei wird read.csv read.table , aber mit sep = "," das Trennzeichen auf ein Komma gesetzt.
# 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
Die benutzerfreundliche Option file.choose ermöglicht das Durchsuchen der Verzeichnisse:
df <- read.csv(file.choose())
Anmerkungen
- Im Gegensatz zu
read.tablehatread.csvheader = TRUEund verwendet die erste Zeile als Spaltennamen. - Alle diese Funktionen werden Strings konvertieren
factorKlasse standardmäßig , es sei denn entwederas.is = TRUEoderstringsAsFactors = FALSE. - Die
read.csv2Variante verwendet standardmäßigsep = ";"unddec = ","für Daten aus Ländern, in denen das Komma als Dezimalpunkt und das Semikolon als Feldtrennzeichen verwendet wird.
Importieren mit Paketen
Die readr Paket read_csv Funktion bietet viel schnellere Leistung, einen Fortschrittsbalken für große Dateien und populäreren Standardoptionen als Standard read.csv , einschließlich 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
Importieren mit data.table
Das Paket data.table führt die Funktion fread . Während es ähnlich ist read.table , fread ist in der Regel schneller und flexibler, automatisch die Datei der Begrenzungs erraten.
# 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
Wo Argument input ist eine Zeichenfolge , die:
- der Dateiname ( zB
"filename.csv"), - ein Shell-Befehl, der auf eine Datei wirkt ( z. B.
"grep 'word' filename"), oder - der Eingang selbst ( zB
"input1, input2 \n A, B \n C, D").
fread gibt ein Objekt der Klasse data.table , die von Klasse erbt data.frame mit der data.table der Nutzung, geeignet für die Verwendung [] . Um ein gewöhnliches data.frame zurückzugeben, setzen Sie den data.table -Parameter auf 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
Anmerkungen
-
freadhat nicht alle Optionen wieread.table. Ein fehlendes Argument istna.commentkann zu unerwünschtem Verhalten führen, wenn die Quelldatei#enthält. -
freadverwendet nur"fürquoteParameter. -
freadverwendet einige (5) Zeilen, um Variablentypen zu erraten.
.Tsv-Dateien als Matrizen importieren (Basis-R)
Viele Leute verwenden file.path nicht, wenn Sie den Pfad zu einer Datei erstellen. Wenn Sie mit Windows-, Mac- und Linux-Computern arbeiten, empfiehlt es sich normalerweise, Pfade anstelle von paste .
FilePath <- file.path(AVariableWithFullProjectPath,"SomeSubfolder","SomeFileName.txt.gz")
Data <- as.matrix(read.table(FilePath, header=FALSE, sep ="\t"))
Im Allgemeinen reicht dies für die meisten Menschen aus.
Es kommt manchmal vor, dass die Matrixabmessungen so groß sind, dass die Prozedur der Speicherzuordnung beim Einlesen der Matrix berücksichtigt werden muss, was bedeutet, dass die Matrix Zeile für Zeile eingelesen wird.
Nehmen Sie das vorherige Beispiel. In diesem Fall enthält FilePath eine Datei der Dimension 8970 8970 wobei 79% der Zellen Werte enthalten, die nicht Null sind.
system.time(expr=Data<-as.matrix(read.table(file=FilePath,header=FALSE,sep=" ") ))
system.time dass 267 Sekunden zum Lesen der Datei benötigt wurden.
user system elapsed
265.563 1.949 267.563
Ebenso kann diese Datei Zeile für Zeile gelesen werden.
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
Es gibt auch das Paket futile.matrix , das eine read.matrix Methode implementiert. Der Code selbst enthüllt sich als das gleiche wie in Beispiel 1 beschrieben.
.Csv-Dateien exportieren
Export mit Basis R
Daten können mit write.csv() in eine CSV-Datei geschrieben werden:
write.csv(mtcars, "mtcars.csv")
Zu den row.names = FALSE angegebenen Parametern gehören row.names = FALSE und na = "" .
Exportieren mit Paketen
readr::write_csv ist deutlich schneller als write.csv und schreibt keine write.csv .
library(readr)
write_csv(mtcars, "mtcars.csv")
Importieren Sie mehrere CSV-Dateien
files = list.files(pattern="*.csv")
data_list = lapply(files, read.table, header = TRUE)
Dies liest jede Datei und fügt sie einer Liste hinzu. Wenn alle data.frame danach dieselbe Struktur haben, können sie zu einem großen data.frame kombiniert werden:
df <- do.call(rbind, data_list)
Dateien mit fester Breite importieren
Feste Breite Dateien , Textdateien , in denen Spalten von keinen Zeichenbegrenzer getrennt ist , wie , oder ; , sondern haben eine feste Zeichenlänge ( Breite ). Daten werden normalerweise mit Leerzeichen aufgefüllt.
Ein Beispiel:
Column1 Column2 Column3 Column4Column5
1647 pi 'important' 3.141596.28318
1731 euler 'quite important' 2.718285.43656
1979 answer 'The Answer.' 42 42
Nehmen wir an, diese Datentabelle befindet sich in der lokalen Datei constants.txt im Arbeitsverzeichnis.
Import mit 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
Hinweis:
-
Column4Column5müssen nicht durch ein Zeichen getrennt werden (Column4Column5) - Der
widthsParameter definiert die Breite jeder Spalte - Nicht getrennte Header können mit
read.fwf()nichtread.fwf()
Importieren mit 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
Hinweis:
- Die Hilfsfunktionen
fwf_*vonfwf_*bieten alternative Möglichkeiten zum Angeben von Spaltenlängen, einschließlich des automatischenfwf_empty(fwf_empty). - readr ist schneller als Basis R
- Spaltentitel können nicht automatisch aus der Datendatei importiert werden