2013-08-22 2 views
5

ich einen großen Datenrahmen, die von Daten besteht, die etwa wie folgt aussieht:R: Schleife durch Datenrahmen Teilmenge der Daten zu extrahieren, je nach Datum

 date w x y z region 
1 2012 01 21 43 12 3 NORTH 
2 2012 02 32 54 21 16 NORTH 
3 2012 03 14 32 65 32 NORTH 
4 2012 04 65 33 75 21 NORTH 
:  :  : : : :  : 
:  :  : : : :  : 
12 2012 12 32 58 53 17 NORTH 
13 2012 01 12 47 43 23 SOUTH 
14 2012 02 87 43 21 76 SOUTH 
:  :  : : : :  : 
25 2012 01 12 46 84 29 EAST 
26 2012 02 85 29 90 12 EAST 
:  :  : : : :  : 
:  :  : : : :  : 

I Abschnitt der Daten extrahieren möchten, dass die haben gleicher date Wert, zum Beispiel des für 2012 01 nur tun würde ich nur eine Teilmenge der Daten

data_1 <- subset(data, date == "2012 01") 

schaffen und das gibt mir alle Daten für 2012 01 aber ich dann gehen auf eine Funktion auf diese Daten anzuwenden. Ich möchte meine Funktion auf alle möglichen Teilmengen meiner Daten anwenden können, also würde ich idealerweise meinen großen Datenrahmen durchlaufen und die Daten für 2012 01, 2012 02, 2012 03, 2012 04... extrahieren und eine Funktion für jede dieser Teilmengen von Daten separat anwenden.

Aber ich würde gerne in der Lage sein, dies auf meinen Datenrahmen anzuwenden, selbst wenn sich meine Datenrahmenlänge ändern würde, so dass es nicht immer von 2012 01 - 2012 12 gehen kann, kann der Datumsbereich variieren, so dass er manchmal verwendet werden kann auf Daten von zum Beispiel 2011 03 - 2013 01.

Antwort

9

ist das was du willst? df_list <- split(data, as.factor(data$date))

+0

das ist perfekt! Solch eine einfache Antwort für etwas, das ich dachte, wäre viel komplexer, danke – userk

0

können Sie teilen Sie Ihre data.frame in eine list von data.frames wie folgt aus:

list.of.dfs<-by(data,data$date) 
+0

scheint nicht zu funktionieren. fehlende FUN-Parameter für die von() –

0

Dies ist eine perfekte Lage für die plyr Paket:

require(plyr) 
ddply(my_df, .(date), my_function, extra_arg_1, extra_arg_2) 

wo my_function ist die gewünschte Funktion in den geteilten Datenrahmen durchzuführen, und extra_arg s sind irgendwelche zusätzlichen Argumente, die zu dieser Funktion gehen müssen.

ddply (d ata frame ->d ata Rahmen) ist die Form, die Sie wollen, wenn Sie Ihre Ergebnisse in einem Datenrahmen wollen; dlply gibt eine Liste zurück.

14

Wiederholen Sie jedes einzelne Datum und erstellen Sie die Teilmenge.

uniq <- unique(unlist(data$Date)) 
for (i in 1:length(uniq)){ 
    data_1 <- subset(data, date == uniq[i]) 
    #your desired function 
} 
+0

Ich mag diese Antwort auch sehr, danke – userk

+0

Wird jede Teilmenge einen eindeutigen Namen haben? Von dem, was ich sehe, wirst du am Ende jede Teilmenge in einen Datenrahmen setzen. Thx – BlackHat

+0

nein jede Schleife überschreibt nur 'data_1' und dann kann der Benutzer eine beliebige Funktion auf den Datenrahmen anwenden und selbst auswählen, wo die Ergebnisse gespeichert werden sollen. – TylerDurden

2

Nach Untereinstellungen Ihres Datensatzes nach Datum, sich vorstellen, dass die Funktion, die Sie jeder Teilmenge anwenden möchte, ist der Mittelwert der Spalte x zu finden. Sie könnten es so machen: (df ist Ihr Datenrahmen)

library(plyr) 
ddply(df, .(date), summarize, mean = mean(x)) 
Verwandte Themen