So etwas wie das Folgende sollte dazu führen, dass jeder Datenrahmen als separates Element in einer einzelnen Liste angezeigt wird:
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
Dies setzt voraus, dass Sie diese CSVs in einem einzigen Verzeichnis haben - Ihrem aktuellen Arbeitsverzeichnis - und dass alle die Erweiterung in Kleinbuchstaben haben .csv
.
Wenn Sie dann die Datenrahmen in einem einzigen Datenrahmen kombinieren möchten, finden Sie die Lösungen in anderen Antworten mit Dingen wie do.call(rbind,...)
, dplyr::bind_rows()
oder data.table::rbindlist()
.
Wenn Sie wirklich jeden Datenrahmen in einem separaten Objekt haben möchten, obwohl dies oft nicht ratsam ist, können Sie Folgendes tun assign
:
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i]))
Oder ohne assign
und um zu demonstrieren, (1) wie der Dateiname bereinigt werden kann und (2) wie er verwendet wird list2env
, können Sie Folgendes versuchen:
temp = list.files(pattern="*.csv")
list2env(
lapply(setNames(temp, make.names(gsub("*.csv$", "", temp))),
read.csv), envir = .GlobalEnv)
Aber auch hier ist es oft besser, sie in einer einzigen Liste zu belassen.
A5C1D2H2I1M1N2O1R2T1
quelle
assign
... auszuführen. Wenn die zugewiesenen Werte in der globalen Umgebung gespeichert werden sollen, stellen Sie sicher, dass Sie diese festlegeninherits=T
.Eine schnelle und prägnante
tidyverse
Lösung: (mehr als doppelt so schnell wie die von Base Rread.csv
)und data.table 's
fread()
können diese Ladezeiten sogar noch einmal halbieren . (für 1/4 der Basis-R- Zeiten)Das
stringsAsFactors = FALSE
Argument hält den Datenrahmenfaktor frei (und ist, wie Marbel betont, die Standardeinstellung fürfread
)Wenn die Typumwandlung frech ist, können Sie alle Spalten als Zeichen mit dem
col_types
Argument erzwingen .Wenn Sie in Unterverzeichnisse eintauchen möchten, um eine Liste der Dateien zu erstellen, die eventuell gebunden werden sollen, müssen Sie den Pfadnamen angeben und die Dateien mit ihren vollständigen Namen in Ihrer Liste registrieren. Dadurch kann die Bindungsarbeit außerhalb des aktuellen Verzeichnisses fortgesetzt werden. (Stellen Sie sich die vollständigen Pfadnamen als Pässe vor, um eine Bewegung über die Verzeichnisgrenzen hinweg zu ermöglichen.)
Wie Hadley hier beschreibt (ungefähr auf halber Höhe):
Bonus-Funktion - Hinzufügen von Dateinamen zu den Datensätzen gemäß Niks-Funktionsanforderung in den folgenden Kommentaren:
* Fügen Sie
filename
jedem Datensatz das Original hinzu .Code erklärt: Erstellen Sie eine Funktion, um den Dateinamen beim ersten Lesen der Tabellen an jeden Datensatz anzuhängen. Verwenden Sie dann diese Funktion anstelle der einfachen
read_csv()
Funktion.(Die Ansätze zur Typumwandlung und Handhabung von Unterverzeichnissen können auch innerhalb der
read_plus()
Funktion auf die gleiche Weise behandelt werden, wie in der oben vorgeschlagenen zweiten und dritten Variante dargestellt.)Mittlerer Anwendungsfall
Größerer Anwendungsfall
Vielzahl von Anwendungsfällen
Zeilen:
Anzahl der Dateien (1000, 100, 10) Spalten: endgültige Datenrahmengröße (5 MB, 50 MB, 500 MB)
(Klicken Sie auf das Bild, um die Originalgröße anzuzeigen)
Die Basis-R-Ergebnisse sind besser für die kleinsten Anwendungsfälle, in denen der Aufwand, die C-Bibliotheken von purrr und dplyr zum Tragen zu bringen, die Leistungsgewinne überwiegt, die bei der Ausführung von Verarbeitungsaufgaben in größerem Maßstab beobachtet werden.
Wenn Sie Ihre eigenen Tests ausführen möchten, ist dieses Bash-Skript möglicherweise hilfreich.
bash what_you_name_this_script.sh "fileName_you_want_copied" 100
erstellt 100 Kopien Ihrer Datei fortlaufend nummeriert (nach den ersten 8 Zeichen des Dateinamens und einem Unterstrich).Zuschreibungen und Wertschätzungen
Mit besonderem Dank an:
map_df()
hier vorgestellt hat .fread()
. (Ich muss lernendata.table
.)quelle
readAddFilename <- function(flnm) { read_csv(flnm) %>% mutate(filename = flnm) }
Dann lassen Siemap_df
das einfach in das statt in das einfache Nur-Lesen fallenread_csv()
, das jetzt da ist. Ich kann den obigen Eintrag aktualisieren, um die Funktion zu zeigen und wie sie in das Rohr passt, wenn Sie noch Fragen haben oder dies für hilfreich halten.read_csv
es viel langsamer ist alsfread
. Ich würde einen Benchmark hinzufügen, wenn Sie sagen wollen, dass etwas schneller ist. Eine Idee ist, 30 1-GB-Dateien zu erstellen und diese zu lesen. Dies ist ein Fall, in dem die Leistung wichtig ist.fread()
und dplyr ‘ sread_csv()
: 14,2 vs 19,9 Sekunden. TBH, ich hatte nur Base R mit dplyr verglichen und daread_csv()
es ungefähr 2-4x schneller als das istread.csv()
, schien Benchmarking nicht notwendig zu sein. Es war jedoch interessant,fread()
einen Wirbel zu machen und eine Pause einzulegen, um vollständigere Benchmark-Ergebnisse zu sehen. Danke noch einmal!Hier sind einige Optionen zum Konvertieren der CSV-Dateien in einen data.frame mithilfe von R base und einige der verfügbaren Pakete zum Lesen von Dateien in R.
Dies ist langsamer als die folgenden Optionen.
Bearbeiten: - Noch ein paar zusätzliche Auswahlmöglichkeiten mit
data.table
undreadr
Eine
fread()
Version, die eine Funktion desdata.table
Pakets ist. Dies ist bei weitem die schnellste Option in R .Verwenden von readr , einem weiteren Paket zum Lesen von CSV-Dateien. Es ist langsamer als
fread
, schneller als Basis R, hat aber unterschiedliche Funktionen.quelle
data.table
Version hinzugefügt , die die Leistung verbessern soll.do.call
Neben der Verwendung
lapply
oder eine andere Schleifenkonstrukt in R könnten Sie Ihre CSV - Dateien in einer einzigen Datei zusammenführen.Wenn die Dateien unter Unix keine Header hatten, ist dies so einfach wie:
oder wenn es Überschriften gibt und Sie eine Zeichenfolge finden, die mit Überschriften und nur mit Überschriften übereinstimmt (dh, alle Überschriften beginnen alle mit "Alter"), würden Sie Folgendes tun:
Ich denke, in Windows könnten Sie dies mit
COPY
undSEARCH
(oderFIND
etwas anderem) über das DOS-Befehlsfeld tun , aber warum nichtcygwin
die Unix-Befehlsshell installieren und nutzen?quelle
Git
Installation zusammenfällt?Dies ist der Code, den ich entwickelt habe, um alle CSV-Dateien in R zu lesen. Er erstellt einen Datenrahmen für jede CSV-Datei einzeln und betitelt den ursprünglichen Namen der Datei (Entfernen von Leerzeichen und CSV). Ich hoffe, Sie finden ihn nützlich!
quelle
Die drei wichtigsten Antworten von @ A5C1D2H2I1M1N2O1R2T1, @leerssej und @marbel sind alle im Wesentlichen gleich: Wenden Sie fread auf jede Datei an und binden Sie dann die resultierenden data.tables rbind / rbindlist. Normalerweise benutze ich das
rbindlist(lapply(list.files("*.csv"),fread))
Formular.Dies ist besser als andere R-interne Alternativen und für eine kleine Anzahl großer CSVs in Ordnung, aber nicht die beste für eine große Anzahl kleiner CSVs, wenn es auf Geschwindigkeit ankommt. In diesem Fall kann die erste Verwendung viel schneller sein
cat
, wie @Spacedman in der Antwort auf Rang 4 vorschlägt. Ich werde einige Details dazu in R hinzufügen:Was ist jedoch, wenn jede CSV einen Header hat?
Und was ist, wenn Sie so viele Dateien haben, dass der
*.csv
Shell-Glob ausfällt?Und was ist, wenn alle Dateien einen Header haben UND zu viele Dateien vorhanden sind?
Und was ist, wenn die resultierende verkettete CSV zu groß für den Systemspeicher ist?
Mit Überschriften?
Was ist, wenn Sie nicht alle CSV-Dateien in einem Verzeichnis haben möchten, sondern nur einen bestimmten Satz von Dateien? (Außerdem haben alle Header.) (Dies ist mein Anwendungsfall.)
und das ist ungefähr die gleiche Geschwindigkeit wie bei einfachen Fread Xargs Cat :)
Hinweis: Lassen Sie für die Datentabelle vor Version 1.11.6 (19. September 2018) das
cmd=
von wegfread(cmd=
.Nachtrag: Die Verwendung von mclapply der parallelen Bibliothek anstelle von serial lapply, z. B.,
rbindlist(lapply(list.files("*.csv"),fread))
ist auch viel schneller als rbindlist lapply fread.Zeit zum Lesen von 121401 CSVs in eine einzelne Datentabelle. Jede CSV hat 3 Spalten, eine Kopfzeile und durchschnittlich 4,510 Zeilen. Maschine ist eine GCP-VM mit 96 Kernen:
Zusammenfassend lässt sich sagen, dass fread xargs cat etwa 50-mal schneller ist als die schnellste Lösung in den Top-3-Antworten, wenn Sie an Geschwindigkeit interessiert sind und viele Dateien und viele Kerne haben.
quelle
Meiner Ansicht nach sind die meisten anderen Antworten veraltet durch
rio::import_list
, was ein prägnanter Einzeiler ist:Alle zusätzlichen Argumente werden an übergeben
rio::import
.rio
kann umgehen kann mit fast jedem Dateiformat R gelesen, und es verwendetdata.table
‚sfread
möglich , wo, so dass es schnell sein.quelle
Bei Verwendung von
plyr::ldply
wird die Geschwindigkeit um ca. 50% erhöht, indem die.parallel
Option aktiviert wird, während 400 CSV-Dateien mit jeweils ca. 30-40 MB gelesen werden. Das Beispiel enthält eine Textfortschrittsleiste.quelle
fread
oderuser-defined functions
? Vielen Dank!?ldply
werden...
andere Argumente angezeigt, die an weitergegeben wurden.fun
. Verwenden Sie entwederfread, skip = 100
oderfunction(x) fread(x, skip = 100)
würde funktionierenfunction(x) fread(x, skip = 100)
hat bei mir nicht funktioniert, aber die Bereitstellung zusätzlicher Argumente nach dem Namen der nackten Funktion hat den Trick getan. Danke noch einmal!Aufbauend auf dem Kommentar von dnlbrk kann die Zuweisung für große Dateien erheblich schneller sein als list2env.
Wenn Sie das Argument full.names auf true setzen, erhalten Sie den vollständigen Pfad zu jeder Datei als separate Zeichenfolge in Ihrer Dateiliste. Beispiel: List_of_file_paths [1] lautet beispielsweise "C: / Users / Anon / Documents /". Folder_with_csv_files / file1.csv "
Sie können anstelle von read_csv den Fread oder die Basis R read.csv des data.table-Pakets verwenden. Mit dem Schritt Dateiname können Sie den Namen aufräumen, damit nicht jeder Datenrahmen mit dem vollständigen Pfad zur Datei als Name verbleibt. Sie können Ihre Schleife erweitern, um weitere Änderungen an der Datentabelle vorzunehmen, bevor Sie sie in die globale Umgebung übertragen. Beispiel:
quelle
Dies ist mein spezielles Beispiel, um mehrere Dateien zu lesen und zu einem Datenrahmen zu kombinieren:
quelle
rbindlist()
vondata.table
Die folgenden Codes sollten Ihnen die schnellste Geschwindigkeit für Big Data bieten, solange Sie viele Kerne auf Ihrem Computer haben:
Aktualisiert am 16.04.2020: Da ich ein neues Paket für die parallele Berechnung finde, wird eine alternative Lösung mit den folgenden Codes bereitgestellt.
quelle
Ich mag den Ansatz
list.files()
,lapply()
undlist2env()
(oderfs::dir_ls()
,purrr::map()
undlist2env()
). Das scheint einfach und flexibel.Alternativ können Sie das kleine Paket { tor } ( to-R ) ausprobieren : Standardmäßig werden Dateien aus dem Arbeitsverzeichnis in eine Liste (
list_*()
Varianten) oder in die globale Umgebung (load_*()
Varianten) importiert .Zum Beispiel lese ich hier alle CSV-Dateien aus meinem Arbeitsverzeichnis in eine Liste mit
tor::list_csv()
:Und jetzt lade ich diese Dateien in meine globale Umgebung mit
tor::load_csv()
:Sollten Sie müssen bestimmte Dateien lesen, können Sie ihre Datei-Pfad mit übereinstimmen
regexp
,ignore.case
undinvert
.Für noch mehr Flexibilität verwenden
list_any()
. Sie können die Reader-Funktion über das Argument bereitstellen.f
.Übergeben Sie zusätzliche Argumente über ... oder innerhalb der Lambda-Funktion.
quelle
Es wurde angefordert, dass ich diese Funktionalität zum Paket stackoverflow R hinzufüge. Da es sich um ein tinyverse Paket handelt (und nicht von Paketen von Drittanbietern abhängen kann), habe ich mir Folgendes ausgedacht:
Durch die Parametrisierung der Lese- und Reduzierungsfunktion können Benutzer data.table oder dplyr verwenden, wenn sie dies wünschen, oder einfach die Basis-R-Funktionen verwenden, die für kleinere Datensätze in Ordnung sind.
quelle