2014-05-13 17 views
22

Sto lavorando con i ritorni giornalieri da un indice brasiliano (IBOV) dal 1993, sto cercando di capire il modo migliore per sottoinsieme per periodi tra 2 date.Sottoinsieme di un dataframe tra 2 date

La cornice di dati (IBOV_RET) è la seguente:

head(IBOV_RET) 
     DATE 1D_RETURN 
1 1993-04-28 -0.008163265 
2 1993-04-29 -0.024691358 
3 1993-04-30 0.016877637 
4 1993-05-03 0.000000000 
5 1993-05-04 0.033195021 
6 1993-05-05 -0.012048193 
... 

ho creato 2 variabili DATE1 e DATE2 come date

DATE1 <- as.Date("2014-04-01") 
DATE2 <- as.Date("2014-05-05") 

sono stato in grado di creare un nuovo sottoinsieme utilizzando questo codice:

TEST <- IBOV_RET[IBOV_RET$DATE >= DATE1 & IBOV_RET$DATE <= DATE2,] 

Ha funzionato, ma mi chiedevo se c'è un modo migliore per suddividere i dati tra 2 date, magari usando subset.

+2

Se il nome del tuo dataframe '' df'' e le date '' '' t1'' e t2'', si può ottenere qualcosa di più breve come: '' df [df $ Data% in% t1: t2,] ''. Per chiarire, '' t1: t2'' funziona con le date, quindi non è necessario avere disuguaglianze. – PatrickT

risposta

5

è possibile utilizzare la funzione di subset() con l'operatore &:

subset(IBOV_RET, DATE1> XXXX-XX-XX & DATE2 < XXXX-XX-XX) 
+2

Avrai ancora bisogno di avvolgere le tue stringhe di data con la funzione as.Date() ... – Dan

3

v'è alcun reale altro modo per estrarre intervalli di date. La logica equivale a estrarre un intervallo di valori numerici, è sufficiente eseguire la conversione della data esplicita come si è fatto. È possibile rendere più breve il subset come si farebbe con qualsiasi altra attività di subsetting con subset o with. È possibile interrompere intervalli in intervalli con cut (esiste un sovraccarico specifico cut.Date). Ma la base R non ha modo di specificare i valori letterali delle date, quindi non puoi evitare la conversione. Non riesco a immaginare quale altra sintassi potresti aver avuto in mente.

15

Come già sottolineato da @MrFlick, non è possibile aggirare la logica di base del subsetting. Un modo per semplificare la suddivisione del tuo specifico data.frame è la definizione di una funzione che prende due input come DATE1 e DATE2 nell'esempio e restituisce il sottoinsieme di IBOV_RET in base a tali parametri di sottoinsieme.

myfunc <- function(x,y){IBOV_RET[IBOV_RET$DATE >= x & IBOV_RET$DATE <= y,]} 

DATE1 <- as.Date("1993-04-29") 
DATE2 <- as.Date("1993-05-04") 

Test <- myfunc(DATE1,DATE2)  

#> Test 
#  DATE X1D_RETURN 
#2 1993-04-29 -0.02469136 
#3 1993-04-30 0.01687764 
#4 1993-05-03 0.00000000 
#5 1993-05-04 0.03319502 

È inoltre possibile inserire le date specifiche direttamente in myfunc:

myfunc(as.Date("1993-04-29"),as.Date("1993-05-04")) #will produce the same result 
0

I sorta di amo dplyr pacchetto
Quindi, se si

>library("dplyr") 

e poi, come hai fatto tu:

>Date1<-as.Date("2014-04-01") 
>Date2<-as.Date("2014-05-05") 

Infine

>test<-filter(IBOV_RET, filter(DATE>Date1 & DATE<Date2)) 
0

Che dire:

DATE1 <- as.Date("1993-04-29") 
DATE2 <- as.Date("1993-05-04") 

# creating a data range with the start and end date: 
dates <- seq(DATE1, DATE2, by="days") 

IBOV_RET <- subset(IBOV_RET, DATE %in% dates) 
Problemi correlati