2013-08-22 6 views
5

ho una grande cornice di dati che si compone di dati che sembra qualcosa di simile:R: ciclo attraverso frame di dati estrazione sottoinsieme di dati a seconda della data

 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 
:  :  : : : :  : 
:  :  : : : :  : 

Voglio estrarre la sezione dei dati che hanno la stesso valore date, ad esempio per fare questo solo per 2012 01 vorrei solo creare un sottoinsieme di dati

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

e questo mi dà tutti i dati per 2012 01 ma poi andare a applicare una funzione a questi dati. Mi piacerebbe essere in grado di applicare la mia funzione a tutti i possibili sottoinsiemi dei miei dati, quindi idealmente sarei in loop attraverso il mio grande frame di dati ed estraendo i dati per 2012 01, 2012 02, 2012 03, 2012 04... e applicando una funzione a ciascuno di questi sottoinsiemi di dati separatamente.

Ma vorrei essere in grado di applicare questo al mio frame di dati anche se la lunghezza dei miei frame di dati dovessero cambiare, quindi non può sempre andare da 2012 01 - 2012 12, l'intervallo di date può variare in modo che a volte può essere utilizzato su dati, ad esempio 2011 03 - 2013 01.

risposta

9

è questo che vuoi? df_list <- split(data, as.factor(data$date))

+0

questo è perfetto! Una risposta così semplice per qualcosa che pensavo sarebbe stata molto più complessa, grazie – userk

0

È possibile dividere il data.frame in un list di data.frames come questo:

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

non sembra funzionare. manca il parametro FUN per il() –

0

Questa è una situazione ideale per il pacchetto plyr:

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

dove my_function è la funzione che si desidera per eseguire sui frame di dati suddivisi, e extra_arg s sono argomenti aggiuntivi che devono andare a quella funzione.

ddply (d ata frame ->d ata frame) è il modulo che si desidera se si desidera ottenere i risultati in un frame di dati; dlply restituisce una lista.

14

Passare attraverso ciascuna data univoca e creare il sottoinsieme.

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

Mi piace molto anche questa risposta, grazie – userk

+0

Ciascun sottoinsieme avrà un nome univoco? Da quello che vedo, finirai per mettere ogni sottoinsieme in un dataframe. Grazie a – BlackHat

+0

, nessun loop sovrascriverà semplicemente 'data_1' e quindi l'utente potrà applicare qualsiasi funzione al dataframe e scegliere autonomamente dove archiviare i risultati. – TylerDurden

2

Dopo sub-impostare il set di dati in base alla data, immaginate che la funzione che si desidera applicare a ciascun gruppo è quello di trovare la media della colonna x. Puoi farlo in questo modo: (df è il tuo dataframe)

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