Подтвердить что ты не робот

Подмножество кадра данных между двумя датами

Я работаю с ежедневными доходами от бразильского индекса (IBOV) с 1993 года, я пытаюсь найти лучший способ подмножества периодов между двумя датами.

Кадр данных (IBOV_RET) выглядит следующим образом:

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

Я установил 2 переменные DATE1 и DATE2 в качестве дат

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

Мне удалось создать новый подмножество, используя этот код:

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

Это сработало, но мне было интересно, есть ли лучший способ подмножества данных между двумя датами, возможно, используя subset.

4b9b3361

Ответ 1

Как уже указывалось @MrFlick, вы не обходите основную логику подмножества. Один из способов облегчить вам подмножество вашего конкретного data.frame будет определять функцию, которая принимает два входа типа DATE1 и DATE2 в вашем примере, а затем возвращает подмножество IBOV_RET в соответствии с этими параметрами подмножества.

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

Вы также можете ввести конкретные даты непосредственно в myfunc:

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

Ответ 2

Вы можете использовать функцию subset() с оператором &:

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

Ответ 3

Нет другого способа извлечь диапазоны дат. Логика такая же, как и извлечение диапазона числовых значений, вам просто нужно сделать явное преобразование даты, как вы это сделали. Вы можете сделать свою подмножество короче, как и с любой другой задачей подмножества с subset или with. Вы можете разбить диапазоны на интервалы с помощью cut (существует определенная перегрузка cut.Date). Но база R не имеет возможности указывать литералы Date, поэтому вы не можете избежать преобразования. Я не могу себе представить, какой другой синтаксис вы могли иметь в виду.

Ответ 4

Я люблю любовь dplyr пакет
Так что если вы

>library("dplyr")

а затем, как вы это делали:

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

Наконец

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

Ответ 5

Как насчет:

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)