2014-05-13 4 views
22

저는 1993 년부터 브라질 인덱스 (IBOV)에서 일일 수익을 얻고 있습니다. 두 날짜 사이의 기간 동안 하위 집합을 만드는 가장 좋은 방법을 찾으려고합니다. 다음두 날짜 사이의 데이터 프레임 하위 집합

데이터 프레임 (IBOV_RET) 인 : I 2 개 변수 DATE1 및 일자 DATE2 설정

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

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

I이 코드를 사용하여 새로운 집합을 생성 할 수 있었다 :

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

효과가 있었지만 subset을 사용하여 2 날짜 사이에 데이터를 부분 집합하는 더 좋은 방법이 있습니다.

+2

당신이 당신의 dataframe''df'' 및 날짜''t1''와''t2'' 이름을 경우에, 당신은 뭔가 짧아 질 수 있습니다 like :''df [df $ % % in % t1 : t2,]''. 명확히하기 위해''t1 : t2''는 날짜와 연동되므로 불평등을 가질 필요가 없습니다. – PatrickT

답변

5

당신은 & 운영자로 subset() 기능을 사용할 수 있습니다 : 날짜 범위를 추출하는 실제 다른 방법은 없습니다

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

당신은 여전히 ​​as.Date() 함수로 날짜 문자열을 감쌀 필요가 있습니다 ... – Dan

3

. 논리는 숫자 값의 범위를 추출하는 것과 동일합니다. 수행 한 것처럼 명시적인 날짜 변환을 수행하면됩니다. subset 또는 with을 사용하여 다른 하위 작업과 마찬가지로 하위 집합을 더 짧게 만들 수 있습니다. cut 간격으로 범위를 분할 할 수 있습니다 (특정 cut.Date 오버로드가 있음). 그러나 기본 R에는 날짜 리터럴을 지정할 수있는 방법이 없으므로 변환을 피할 수 없습니다. 내가 생각할 수있는 다른 종류의 구문을 상상할 수는 없습니다.

15

이미 @MrFlick에 의해 지적 되었 듯이, 서브 세트의 기본 논리를 둘러 보지 마십시오. 특정 data.frame의 하위 집합을 쉽게 만드는 한 가지 방법은 예제에서 DATE1DATE2과 같은 두 개의 입력을 취한 다음 해당 하위 집합 매개 변수에 따라 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 
0

내가 종류의 dplyr 패키지를 사랑
그럼 당신

>library("dplyr") 

그리고 만약, 당신이 그랬던 것처럼 :

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

마지막

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

무엇에 대해 :

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) 
관련 문제