Подмножество кадра данных между двумя датами
Я работаю с ежедневными доходами от бразильского индекса (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
.
Ответы
Ответ 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)