2017-05-29 32 views
1

我有一個數據集,每週有一行2年(所以104行)。我有一個每週1或0的標誌欄。我想用以下邏輯創建一個新列:一種自動化的方式來使用帶延遲的SAS滯後函數/循環?

如果該標誌= 1表示那一週有1,那麼接下來的3周爲flag_new。

我目前的做法,它的工作原理是:

if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1; 

雖然這個工作,它如果我想flag_new爲1以下20或30周,而不是短短三週內,變得非常乏味。

我希望有一個更簡單的方法來做到這一點(也許是一個循環?),但我不太熟悉它。

任何幫助,非常感謝。

回答

0

您可以使用一個臨時數組以及保持滯後信息,然後獲取最高的數組。如果它是一個,那麼你可以將新標誌設置爲1。要更改尺寸,只需將2更改爲您需要的n-1。

這也演示了BY語句並將其重置爲新組的開始。

data want; 

array p{0:2} _temporary_; 

set have; 
by object; 

if first.object then call missing(of p{*}); 
p{mod(_n_,4)} = flag; 
highest = max(of p{*}); 

if highest > 1 then do; 
    flag_new = 1; 
end; 
run; 
2

也許不是回頭看,而是將其視爲未來展望。也就是說,每當您看到標誌= 1時,爲該記錄和後面的三條記錄設置flag_new = 1。喜歡的東西(未經測試):

if flag=1 then count=3; 
else count+(-1) ; *implicit retain from sum statement; 

if count>=0 then flag_new=1;