在SAS

2012-09-27 22 views
2

更換意見,我想分配給一些意見,在「ondays」低於取決於是否變量「失敗」的新變量的值是0或1。在這裏我的數據集在SAS

ID   X  ONDAYS  FAILURE 
    1   0   59   1 
    2   0  514   1 
    3   0  313   0 
    4   0  631   1 
    5   0  107   1 
    6   0   71   0 
    7   0  583   1 
    8   0   91   1 
    9   0   66   1 
    10   0   95   0 

我的目標是對ONDAYS進行排序---從最低到最高(我可以這樣做)---在ONDAYS中對數值進行排序,然後創建一個名爲「NEWDAYS」的新變量,該變量與ONDAYS中的值相同,如果FAILURE = 1,但如果FAILURE = 0,則NEWDAYS將等於ONDAYS中與FAILURE = 1值相對應的最接近(較低值)。 例如在NEWDAYS中,觀察值1將等於59,但觀察值6將等於66(因爲到71的最接近的有序「失敗= 1」值爲66)。 你能幫我解決這個問題嗎?

謝謝。

Roland

回答

2

是這樣的?

data have; 
input ID   X  ONDAYS  FAILURE; 
datalines; 
    1   0   59   1 
    2   0  514   1 
    3   0  313   0 
    4   0  631   1 
    5   0  107   1 
    6   0   71   0 
    7   0  583   1 
    8   0   91   1 
    9   0   66   1 
    10   0   95   0 
    ;;;; 
run; 
proc sort data=have; 
by ondays; 
run; 
data want; 
set have; 
by ondays; 
retain prev_ondays; 
if failure=0 then new_ondays=prev_ondays; 
else new_ondays=ondays; 
output; 
prev_ondays=new_ondays; 
run; 

只是跟蹤以前ONDAYS的,如果需要,將其分配給新ONDAYS。

另一種選擇:SQL。這會更新當前的表格,這可能是需要的,也可能不是;如果沒有,則創建一個新表並應用此表。

proc sql undopolicy=none; 
update have H set ondays=(select max(ondays) from have V where H.ondays ge V.ondays and V.failure=1) 
where failure=0; 
quit; 
+0

好的解決方法,但是,我想你想改變「prev_ondays = ondays;」到「如果失敗= 1,那麼prev_ondays = ondays;」...如果你有連續的記錄失敗= 0 –

+2

沒有。這是由執行時機處理的 - 因爲我已經將ONDAYS更改爲先前的ONDAYS值,新的PREV_ONDAYS是所需的值(兩個或三個或任何行之前)。這就是爲什麼我不使用LAG的原因 - 除了對LAG不合理的反感之外 - 在未知數量的行上管理RETAIN變量更容易。 – Joe

+0

你是對的......如果我已經用額外的輸入數據對它進行了測試,可能已經看到了。這個問題確實要求新的日子作爲一個額外的變種,而不是改變日,但你的數據步驟解決方案可以在任何數量的obs上工作 –