web-dev-qa-db-fra.com

Sous-ensemble d'une trame de données entre 2 dates

Je travaille avec les rendements quotidiens d'un indice brésilien (IBOV) depuis 1993, j'essaie de trouver la meilleure façon de sous-ensemble pour des périodes entre 2 dates.

La trame de données (IBOV_RET) est comme suit :

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

Je mets 2 variables DATE1 et DATE2 comme dates

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

J'ai pu créer un nouveau sous-ensemble en utilisant ce code:

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

Cela a fonctionné, mais je me demandais s'il y avait une meilleure façon de sous-définir les données entre 2 dates, peut-être en utilisant subset.

25
RiskTech

Comme déjà souligné par @MrFlick, vous ne contournez pas la logique de base du sous-ensemble. Une façon de vous faciliter la tâche de sous-ensemble de votre data.frame spécifique serait de définir une fonction qui prend deux entrées comme DATE1 et DATE2 dans votre exemple, puis retourne le sous-ensemble de IBOV_RET selon ces paramètres de sous-ensemble.

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

Vous pouvez également saisir les dates spécifiques directement dans myfunc:

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

Vous pouvez utiliser la fonction subset() avec la fonction & opérateur:

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

Mise à jour pour une approche plus "orientée vers le contraire":

IBOV_RET %>%
  filter(DATE1 > XXXX-XX-XX, DATE2 < XXXX-XX-XX) #comma same as &
9
Dan

Il n'y a pas vraiment d'autre moyen d'extraire les plages de dates. La logique est la même que pour l'extraction d'une plage de valeurs numériques, il vous suffit de faire la conversion de date explicite comme vous l'avez fait. Vous pouvez raccourcir votre sous-ensemble comme vous le feriez pour toute autre tâche de sous-ensemble avec subset ou with. Vous pouvez diviser les plages en intervalles avec cut (il existe un cut.Date surcharge). Mais la base R n'a aucun moyen de spécifier les littéraux de date, vous ne pouvez donc pas éviter la conversion. Je ne peux pas imaginer quel autre type de syntaxe vous avez pu avoir en tête.

4
MrFlick

Qu'en est-il de:

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)
2
eh21

J'aime en quelque sorte le paquet dplyr
Donc, si vous

>library("dplyr")

puis, comme vous l'avez fait:

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

Finalement

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