2013-01-03 48 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」的意見,也是一個和下一個:

​​980

我厭倦了使用「滯後」,併成功地提取了觀察結果與「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選項。 像這樣:

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; 

有通過數據集中implicite循環,當你在set語句中使用它。 _N_是一個自動變量,它包含關於什麼觀測值隱含循環的信息(從1開始)。當您找到您的價值時,您將_N_的值存儲到變量current中,以便您知道在哪個行上找到它。 nobs是數據集中觀測值的總數。

察看prev是大於0,如果next是小於,如果你的行是第一個數據集中nobs避免錯誤(當時沒有前行),如果你的行是最後一個數據集(再有就是沒有下一行)。

+0

Thx,它的工作原理。你會不會介意進一步解釋「當前= _N_;」和「如果prev> 0然後做;」? –

+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; 
相關問題