2013-01-03 2 views
4

는이 같은 데이터 세트 (SP는 지표)이 있습니다읽기 이전 및 다음 관찰

datetime  sp 
ddmmyy:10:30:00 N 
ddmmyy:10:31:00 N 
ddmmyy:10:32:00 Y 
ddmmyy:10:33:00 N 
ddmmyy:10:34:00 N 

을 그리고 나는 또한 이전 및 다음 하나 "Y"와 관찰을 추출 좋아합니다 :

ID    sp 
ddmmyy:10:31:00 N 
ddmmyy:10:32:00 Y 
ddmmyy:10:33:00 N 

"지연"을 사용하고 "Y"와 그 다음의 관측을 성공적으로 추출하는 데 지쳤지만 이전 방법을 추출하는 방법에 대해서는 아직 알지 못합니다. 여기

내 시도입니다 :

data surprise_6_step3; set surprise_6_step2; 
length lag_sp $1; 
lag_sp=lag(sp); 
if sp='N' and lag(sp)='N' then delete; 
run; 

그 결과는 다음과 같습니다

ID    sp 
ddmmyy:10:32:00 Y 
ddmmyy:10:33:00 N 

모든 방법은 이전의 관찰을 추출? 도움이 필요하면 Thx.

답변

5

데이터 단계의 set 문에 point 옵션을 사용해보십시오. 이처럼 :

당신이 set 문에서 사용할 데이터 세트를 통해 implicite 루프가 있습니다
data extract; 
set surprise_6_step2 nobs=nobs; 
if sp = 'Y' then do; 
    current = _N_; 
    prev = current - 1; 
    next = current + 1; 

    if prev > 0 then do; 
    set x point = prev; 
    output; 
    end; 

    set x point = current; 
    output; 

    if next <= nobs then do; 
    set x point = next; 
    output; 
    end; 
end; 

run; 

. _N_은 implicite loop on (1에서 시작)에 대한 정보가 들어있는 자동 변수입니다. 값을 찾으면 변수 current_N_의 값을 저장하여 어떤 행을 찾았는지 알 수 있습니다. nobs은 데이터 세트의 총 관측 수입니다. prev 경우 확인

가 0보다 큰이며 next 경우 행은 데이터 세트에서 첫 번째 경우 nobs 오류를 방지 미만이다 (다음 더 이전 행 없음)하고 행은 데이터 집합의 마지막 인 경우 (다음이 다음 행 없음).

+0

Thx. "current = _N_;"에 대해 더 자세히 설명해 주시겠습니까? "prev> 0이면 do;"? –

+0

나는 나의 대답을 약간 확장했다. 추가 설명을 원하면 언제든지 물어보십시오. – Tartaglia

+0

좋은 답변입니다! 다시 한번 감사드립니다. –

0
/* generate test data */ 
data test; 
    do dt = 1 to 100; 
     sp = ifc(rand("uniform") > 0.75, "Y", "N"); 
     output; 
    end; 
run; 

proc sql; 
    create table test2 as 
     select *, 
      monotonic() as _n 
     from test 
    ; 
    create table test3 (drop= _n) as 
     select a.* 
     from test2 as a 
     full join test2 as b 
      on a._n = b._n + 1 
     full join test2 as c 
      on a._n = c._n - 1 
     where a.sp = "Y" 
      or b.sp = "Y" 
      or c.sp = "Y" 
    ; 
quit;