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