Wie erstelle ich eine Liste von Datenrahmen und wie greife ich über die Liste auf jeden dieser Datenrahmen zu?
Wie kann ich diese Datenrahmen beispielsweise in eine Liste aufnehmen?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
=
nicht<-
drinnen verwendendata.frame()
. Durch die Verwendung<-
erstellen Siey1
undy2
in Ihrer globalen Umgebung und Ihr Datenrahmen ist nicht das, was Sie wollen.<-
s in data.frame () an. Was für ein Neuling ich war.Antworten:
Dies hängt nicht mit Ihrer Frage zusammen, aber Sie möchten sie verwenden
=
und nicht<-
innerhalb des Funktionsaufrufs. Wenn Sie verwenden<-
, werden Sie am Ende Variablen erstelleny1
undy2
in welcher Umgebung auch immer Sie arbeiten:Dies hat nicht den scheinbar gewünschten Effekt, Spaltennamen im Datenrahmen zu erstellen:
Der
=
Operator hingegen ordnet Ihre Vektoren Argumenten zudata.frame
.Was Ihre Frage betrifft, ist das Erstellen einer Liste von Datenrahmen einfach:
Sie greifen auf die Datenrahmen genauso zu wie auf jedes andere Listenelement:
quelle
Die anderen Antworten zeigen Ihnen , wie Sie eine Liste von data.frames zu machen , wenn Sie bereits eine Reihe von data.frames, zum Beispiel
d1
,d2
.... Mit Rahmen sequentiell benannt Daten ein Problem, und sie in einer Liste setzen a Gute Lösung, aber es wird empfohlen, zu vermeiden, dass eine Reihe von data.frames überhaupt nicht in einer Liste enthalten sind .Die anderen Antworten enthalten viele Details zum Zuweisen von Datenrahmen zu Listenelementen, zum Zugriff darauf usw. Wir werden dies auch hier ein wenig behandeln, aber der Hauptpunkt ist, dass Sie nicht warten müssen, bis Sie ein paar a haben
data.frames
um sie einer Liste hinzuzufügen. Beginnen Sie mit der Liste.Der Rest dieser Antwort behandelt einige häufige Fälle, in denen Sie möglicherweise versucht sind, sequentielle Variablen zu erstellen, und zeigt Ihnen, wie Sie direkt zu Listen gelangen. Wenn Sie mit Listen in R noch nicht vertraut sind, lesen Sie möglicherweise auch Was ist der Unterschied zwischen
[[
und[
beim Zugriff auf Elemente einer Liste? .Listen von Anfang an
Erschaffe niemals
d1
d2
d3
, ... überhaupt nichtdn
. Erstellen Sie eine Listed
mitn
Elementen.Einlesen mehrerer Dateien in eine Liste von Datenrahmen
Dies ist beim Einlesen von Dateien ziemlich einfach. Vielleicht haben Sie Dateien
data1.csv, data2.csv, ...
in einem Verzeichnis. Ihr Ziel ist eine Liste der aufgerufenen data.framesmydata
. Als erstes benötigen Sie einen Vektor mit allen Dateinamen. Sie können dies mit Einfügen (z. B.my_files = paste0("data", 1:5, ".csv")
)list.files
erstellen , aber es ist wahrscheinlich einfacher, alle entsprechenden Dateien abzurufen :my_files <- list.files(pattern = "\\.csv$")
. Sie können reguläre Ausdrücke verwenden, um die Dateien abzugleichen. Weitere Informationen zu regulären Ausdrücken finden Sie in anderen Fragen, wenn Sie dort Hilfe benötigen. Auf diese Weise können Sie alle CSV-Dateien abrufen, auch wenn sie keinem netten Namensschema folgen. Oder Sie können ein schickeres Regex-Muster verwenden, wenn Sie bestimmte CSV-Dateien aus einer Reihe von Dateien auswählen müssen.Zu diesem Zeitpunkt verwenden die meisten R-Anfänger eine
for
Schleife, und daran ist nichts auszusetzen. Sie funktioniert einwandfrei.Ein eher R-ähnlicher Weg, dies zu tun, ist mit
lapply
, was eine Abkürzung für das Obige istErsetzen Sie natürlich
read.csv
gegebenenfalls andere Datenimportfunktionen .readr::read_csv
oderdata.table::fread
wird schneller sein, oder Sie benötigen möglicherweise auch eine andere Funktion für einen anderen Dateityp.In beiden Fällen ist es praktisch, die Listenelemente so zu benennen, dass sie mit den Dateien übereinstimmen
Aufteilen eines Datenrahmens in eine Liste von Datenrahmen
Das ist super einfach, die Basisfunktion
split()
erledigt das für Sie. Sie können durch eine Spalte (oder Spalten) der Daten oder durch alles andere, was Sie möchten, teilenDies ist auch eine gute Möglichkeit, einen Datenrahmen zur Kreuzvalidierung in Teile zu zerlegen. Vielleicht möchten Sie sich
mtcars
in Trainings-, Test- und Validierungsstücke aufteilen .Simulieren einer Liste von Datenrahmen
Vielleicht simulieren Sie Daten, ungefähr so:
Aber wer macht nur eine Simulation? Sie möchten dies 100 Mal, 1000 Mal, mehr tun! Sie möchten jedoch nicht 10.000 Datenrahmen in Ihrem Arbeitsbereich. Verwenden Sie sie
replicate
und fügen Sie sie in eine Liste ein:Insbesondere in diesem Fall sollten Sie auch überlegen, ob Sie wirklich separate Datenrahmen benötigen oder ob ein einzelner Datenrahmen mit einer "Gruppen" -Spalte genauso gut funktioniert. Verwenden
data.table
oderdplyr
es ist ziemlich einfach, Dinge "nach Gruppe" mit einem Datenrahmen zu tun.Ich habe meine Daten nicht in eine Liste aufgenommen :( Ich werde es beim nächsten Mal tun, aber was kann ich jetzt tun?
Wenn es sich um ein seltsames Sortiment handelt (was ungewöhnlich ist), können Sie sie einfach zuweisen:
Wenn Sie in einem Muster namens Datenrahmen haben, zum Beispiel
df1
,df2
,df3
und Sie diese in einer Liste möchten, können Sieget
sie , wenn Sie einen regulären Ausdruck , die Namen übereinstimmen schreiben können. Etwas wieWird im Allgemeinen
mget
verwendet, um mehrere Objekte abzurufen und in einer benannten Liste zurückzugeben. Sein Gegenstückget
wird verwendet, um ein einzelnes Objekt abzurufen und zurückzugeben (nicht in einer Liste).Kombinieren einer Liste von Datenrahmen zu einem einzelnen Datenrahmen
Eine häufige Aufgabe besteht darin, eine Liste von Datenrahmen zu einem großen Datenrahmen zu kombinieren. Wenn Sie sie übereinander stapeln möchten, würden Sie sie
rbind
für ein Paar verwenden, aber für eine Liste von Datenrahmen gibt es drei gute Möglichkeiten:(Ähnlich mit
cbind
oderdplyr::bind_cols
für Spalten.)Um eine Liste von Datenrahmen zusammenzuführen (zu verbinden), können Sie diese Antworten sehen . Oft besteht die Idee darin, sie
Reduce
mitmerge
(oder einer anderen Verbindungsfunktion) zu verwenden, um sie zusammenzubringen.Warum die Daten in eine Liste aufnehmen?
Setzen Sie ähnliche Daten in Listen , weil Sie ähnliche Dinge zu jedem Datenrahmen tun wollen, und Funktionen wie
lapply
,sapply
do.call
, daspurrr
Paket und die altenplyr
l*ply
Funktionen machen es einfach , das zu tun. Beispiele für Leute, die leicht Dinge mit Listen tun, sind überall in SO.Selbst wenn Sie eine Low-for-Schleife verwenden, ist es viel einfacher, die Elemente einer Liste zu durchlaufen, als Variablennamen mit zu erstellen
paste
und auf die Objekte mit zuzugreifenget
. Auch einfacher zu debuggen.Denken Sie an Skalierbarkeit . Wenn Sie wirklich nur drei Variablen benötigen, es ist in Ordnung zu verwenden
d1
,d2
,d3
. Aber wenn sich herausstellt, dass Sie wirklich 6 brauchen, ist das viel mehr Tippen. Und das nächste Mal, wenn Sie 10 oder 20 brauchen, finden Sie sich selbst kopieren und Codezeilen einfügen, vielleicht finden mit / ersetzen Änderungend14
zud15
, und Sie denken , das ist nicht , wie die Programmierung sein sollte . Wenn Sie eine Liste verwenden, beträgt der Unterschied zwischen 3 Fällen, 30 Fällen und 300 Fällen höchstens eine Codezeile - keine Änderung, wenn Ihre Anzahl von Fällen automatisch erkannt wird, z. B. wie viele.csv
Dateien sich in Ihrer befinden Verzeichnis.Sie können die Elemente einer Liste benennen, falls Sie für den Zugriff auf Ihre Datenrahmen etwas anderes als numerische Indizes verwenden möchten (und Sie können beide verwenden, dies ist keine XOR-Option).
Insgesamt führt die Verwendung von Listen dazu, dass Sie saubereren, besser lesbaren Code schreiben, was zu weniger Fehlern und weniger Verwirrung führt.
quelle
r
und gekennzeichnet sindlist
.my_data <- NULL
"my_data <- list ()" zuweisen! :)my_data <- list()
macht aber deutlich, dass Sie eine Liste erstellen, was gut ist! Klarer Code ist eine gute Sache. Ich sehe keinen Vorteil darin,my_data <- NULL
stattdessen zu verwenden.names(my_data) <- gsub("\\.csv$", "", my_files)
;) <br> Aber ich respektiere deine Ratschläge, da ich als Neuling viel von ihnen lerne und ich es wirklich schätze :)Sie können auch mit
[
und auf bestimmte Spalten und Werte in jedem Listenelement zugreifen[[
. Hier einige Beispiele. Erstens können wir nur auf die erste Spalte jedes Datenrahmens in der Liste zugreifenlapply(ldf, "[", 1)
, wobei1
die Spaltennummer bezeichnet wird.Ebenso können wir mit auf den ersten Wert in der zweiten Spalte zugreifen
Dann können wir auch direkt als Vektor mit auf die Spaltenwerte zugreifen
[[
quelle
Wenn Sie eine große Anzahl von nacheinander benannten Datenrahmen haben, können Sie eine Liste der gewünschten Teilmenge von Datenrahmen wie folgt erstellen:
Dabei wird
my.list2
eine Liste mit dem 2., 3. und 4. Datenrahmen zurückgegeben.Beachten Sie jedoch, dass die Datenrahmen in der obigen Liste nicht mehr benannt sind. Wenn Sie eine Liste mit einer Teilmenge von Datenrahmen erstellen und deren Namen beibehalten möchten, können Sie Folgendes versuchen:
was zurückgibt:
quelle
lapply(foo, get)
Verwenden Sie stattdessen einfachmget(foo)
Unter der Annahme, dass Sie eine "große" Anzahl von data.frames mit ähnlichen Namen haben (hier d #, wobei # eine positive ganze Zahl ist), ist das Folgende eine leichte Verbesserung der Methode von @ mark-miller. Es ist knapper und gibt eine benannte Liste von data.frames zurück, wobei jeder Name in der Liste der Name des entsprechenden ursprünglichen data.frame ist.
Der Schlüssel wird
mget
zusammen mit verwendetls
. Wenn die in der Frage angegebenen Datenrahmen d1 und d2 die einzigen Objekte mit den Namen d # in der Umgebung waren, dannwas zurückkehren würde
Diese Methode nutzt das Musterargument in
ls
, mit dem wir reguläre Ausdrücke verwenden können, um die Namen von Objekten in der Umgebung genauer zu analysieren. Eine Alternative zum regulären Ausdruck"^d[0-9]+$"
ist"^d\\d+$"
.Wie @gregor weist darauf hin , ist es eine bessere Gesamt so Ihre Daten Bauprozess einzurichten , dass die data.frames am Anfang in benannte Listen gesetzt werden.
Daten
quelle
Dies mag etwas spät sein, aber als ich auf Ihr Beispiel zurückkam, dachte ich, ich würde die Antwort nur ein bisschen erweitern.
Dann machen Sie Ihre Liste einfach:
Jetzt haben Sie eine Liste, aber anstatt auf die Liste auf die alte Weise zuzugreifen, wie z
Mit dieser Funktion können Sie den Datenrahmen Ihrer Wahl abrufen und zuweisen.
Holen Sie sich jetzt die, die Sie wollen.
Hoffe, dass extra bisschen hilft.
Prost!
quelle
GETDF_FROMLIST(mylist, 1)
zumylist[[1]]
? Wenn Sie die Funktionssyntax bevorzugen, können Sie sogar auf die"[["(mylist, 1)
Definition einer benutzerdefinierten Funktion verzichten.return(DF_LIST[[ITEM_LOC]])
, ohne dass eine Zwischenvariable zugewiesen werden muss.Sehr einfach ! Hier ist mein Vorschlag:
Wenn Sie Datenrahmen in Ihrem Arbeitsbereich auswählen möchten, versuchen Sie Folgendes:
oder
All dies führt zu demselben Ergebnis.
Sie können ändern
is.data.frame
, um andere Arten von Variablen wie zu überprüfenis.function
quelle
Ich betrachte mich als absoluten Neuling, aber ich denke, ich habe eine äußerst einfache Antwort auf eine der ursprünglichen Unterfragen, die hier nicht angegeben wurden: Zugriff auf die Datenrahmen oder Teile davon.
Beginnen wir mit der Erstellung der Liste mit Datenrahmen wie oben angegeben:
Wenn Sie dann auf einen bestimmten Wert in einem der Datenrahmen zugreifen möchten, können Sie dies tun, indem Sie die doppelten Klammern nacheinander verwenden. Der erste Satz bringt Sie in den Datenrahmen und der zweite Satz bringt Sie zu den spezifischen Koordinaten:
quelle