2012-07-29 4 views
4

나는 시계열과 값의 데이터 프레임을 가졌다. 시계열은 신기원으로부터 초입니다. 여기서 최상위 몇몇 요소가 데이터 프레임과 같이 어떻게데이터 프레임의 간격 검색

val = seq(1,19) 
ts = seq(1342980888,1342982000,by=60) 
x = data.frame(ts = ts,val = val) 
head(x) 

     ts val 
1 1342980888 1 
2 1342980948 2 
3 1342981008 3 
4 1342981068 4 
5 1342981128 5 
6 1342981188 6 

I 입력으로 타임 스탬프를 취하는 구간 검색 기능의 일종 싶다라고 상기 제에 1,342,980,889 (+1 상기 TS 행) 및 1,2 (행 번호) 출력으로 반환해야합니다. 기본적으로, 나는 입력 타임 스탬프 1342980889를 묶는 타임 스탬프를 가진 두 개의 행을 찾고 싶다. "which"를 사용하는 것이 비교적 쉽지만, "which"는 벡터 스캔을하고, 실제 데이터 프레임은 꽤있다. 큰 나는 이진 검색을 사용하여 그것을하고 싶다. 미리 미리 감사드립니다.

답변

5

findInterval 기능을 사용해야합니다. , 그것은 당신에게 x$ts 당신이 찾고있는 값보다 바로 작은 행의 인덱스를 줄 것이다 (그리고 당신은 다른 인덱스를 얻기 위해 하나를 추가해야합니다)

findInterval(1342980889, x$ts) 
# [1] 1 

는 또한 함수가 벡터화되어 있습니다 즉, 첫 번째 인수는 찾을 값의 벡터가 될 수 있습니다.

findInterval(c(1342980889, 1342981483), x$ts) 
# [1] 1 10 
+0

이 방법은 잘 작동합니다. 로그 (N) 시간에 검색이 발생합니까? – broccoli

+0

도움말 페이지의 세부 정보 섹션에서는 복잡성에 대해 설명합니다. – flodel

+0

단일 값으로 검색하려면 yes, O (log (N))를 입력하십시오. 더 일반적으로, 첫 번째 입력이 길이가 n 인 벡터 인 경우 O (n * log (N))이고, 벡터가 정렬되면 O (n)까지 내려갑니다. – flodel

관련 문제