2015-05-28 28 views
6

Ich habe High und Low für was ich denke, ist eine einfache Lösung gesucht.Konvertieren einer Liste von Datenrahmen in einzelne Datenrahmen in R

Ich habe einen großen Datenrahmen, den ich durch Faktoren spalte.

eqRegions <- split(eqDataAll, eqDataAll$SeismicRegion)

Dies schafft nun ein Listenobjekt des Datenrahmen nach Region; es gibt insgesamt 8. Ich möchte die Liste durchlaufen, um einzelne Datenrahmen unter einem anderen Namen zu erstellen.

Ich kann Folgendes ausführen, um die Listenelemente in einzelne Datenrahmen zu konvertieren, aber ich denke, dass es einen Schleifenmechanismus gibt, der schnell ist, wenn ich viele Faktoren habe.

testRegion1 <- eqRegions[[1]]

testRegion3 <- eqRegions[[3]]

ich die oben manuell durchführen kann, und es behandelt sie gut, aber wenn ich es nicht effizient viele Regionen haben. Was würde Ich mag das Äquivalent Folgendes tun:

for (i in 1:length(eqRegions)) { 
    region[i] <- as.data.frame(eqRegions[[i]]) 
} 

Ich denke, der Schlüsselregion vor der Schleife zu definieren ist, aber es hält sich überschreiben und nicht erhöht wird. Danke vielmals.

Antwort

3

Dies sollte funktionieren. Der Name der erstellten data.frames entspricht den Namen innerhalb von eqDataAll$SeismicRegion. Wie auch immer, diese Vorgehensweise zum Auffüllen einzelner data.frames wird nicht empfohlen. Je mehr ich mit R arbeite, desto mehr liebe ich/verwende Liste.

lapply(names(eqRegions), function(x) assign(x, eqRegions[[x]], envir = .GlobalEnv)) 

bearbeiten: Verwenden list2env Lösung geschrieben. War nicht bewusst, list2env Funktion.

+0

Entschuldigung für den Downvote, aber das ist unnötig kompliziert –

3

attach(eqRegions) sollte genug sein. Aber ich empfehle die Arbeit mit ihnen in list Formular mit lapply. Ich garantiere, dass es zu einem einfacheren Code führt.

+0

Dies bringt die Liste auf Ihren Suchpfad, so dass die Variablen nicht mit 'ls' angezeigt werden, aber im Beispiel in Ihrem Kommentar können Sie' 8' mit bekommen '' '' 8''''. –

+0

Hallo Matthew, tut mir leid, ich hatte den Kommentar gelöscht, gepostet: Ich kann nicht ganz sehen, wie das funktioniert: zB 's <- Split (mtcars, mtcars $ cyl); anheften (s) '. Die Verwendung von 'ls()' wird nicht angezeigt, und die Verwendung von ''8'' gibt nicht die finale Tabelle (funktioniert, wenn ich die Zyl-Ebenen beschriftet hätte letters [1: 3] – user20650

+1

Um Variablen mit nicht standardmäßigen Namen zu referenzieren Diejenigen, die mit einer Zahl beginnen, umgeben den Namen in Backticks statt in Anführungszeichen –

17

Versuchen list2env(eqRegions,envir=.GlobalEnv)

+0

du schlägst mich um ein paar Sekunden! +1 – BrodieG

1

Als Alternative eines „best practice“, wenn Daten wie diese Aufteilung ist die data.frames innerhalb einer Liste zu halten, wie split zur Verfügung gestellt. Um sie zu verarbeiten, verwenden Sie entweder oder lapply (viele Faktoren) und erfassen die Ausgabe in einer Liste. Zum Beispiel:

eqRegionsProcessed <- lapply(eqRegions, function(df) { 
    ## do something meaningful here 
}) 

Dies funktioniert natürlich nur, wenn Sie das gleiche zu jedem data.frame tun.

Wenn Sie wirklich brechen müssen und mit jedem data.frame eindeutig umgehen, dann @ MatthewPlourde und @ MaratTalipov Antworten funktionieren.

1

list2env gibt Datenframes an die globale Umgebung zurück, deren Namen die Namen in der Liste sind. Eine Alternative, wenn Sie mit der i aus einer Schleife die gleichen Namen für den Datenrahmen, sondern identifiziert haben wollen:

for (i in 1:length(eqRegions)) { 
    assign(paste0("eqRegions", i), as.data.frame(eqRegions[[i]])) 
} 

Diese langsam sein kann, wenn die Länge, wenn die Liste zu lang wird.

Verwandte Themen