2017-03-29 41 views
0

我只是想創建一個保留上一記錄中特定列的值的新列,以便我可以將現有列與新專欄。更進一步,我希望能夠輸出記錄,使兩列中的值不同並丟失值相同的記錄。SAS保留聲明 - 如何將以前的非缺失值保留在新列中以進行比較

本質上,我希望我的數據集看起來像這樣,其中第一個idr具有保留日期設置爲空:

Idr Date1   Date2 
1 20/01/2016 . 
1 20/01/2016 20/01/2016 
1 18/10/2016 20/01/2016 
2 07/03/2016 . 
2 18/05/2016 07/03/2016 
2 21/10/2016 18/05/2016 
3 29/01/2016 . 
3 04/02/2016 29/01/2016 
3 04/02/2016 04/02/2016 

我已經沿着過去以下行由此我已經創建了一個臨時變量引用數據欲保留使用的代碼:

date_temp=date1; 
    data example2; 
    set example1; 
    by idr date1; 
    date_temp=date1; 
retain date_temp ; 
    if first.idr then do; 
     date_temp=date1; 
    end;else do; 
     date2=date_temp; 
    end; 
run; 

我已經搜索了谷歌的高點和低點 - 任何h elp將不勝感激

回答

1

這裏的技巧是在已經輸出當前行之後爲下一行設置保留變量的值,而不是依賴數據末尾的默認隱式輸出步:

data example2; 
    set example1; 
    by idr; 
    retain date2; 
    if first.idr then call missing(date2); 
    output; 
    date2 = date1; 
    format date2 ddmmyy10.; 
run; 

邏輯輸出語句後執行不會對一個剛剛輸出的行中的任何區別,但直到數據步驟的繼續進行下一次迭代,一切都還處於PDV,包括變量保留在下一行,所以這是一個更新它們的機會。 More details on the PDV

這樣做,使用lag功能的另一種方式:

data example3; 
    set example1; 
    date2 = lag(date1); 
    if idr ne lag(idr) then call missing(date2); 
run; 

使用lag時要小心 - 它返回從lag功能的該實例中的數據的步驟,而不是在執行最後一次值必然是前一行的那個變量的值,所以如果你做類似if condition then mylaggedvar=lag(var);

+0

嗨 - 感謝您的回覆。滯後函數完美運作!我也嘗試過你提到的第一種方法,但是它沒有任何運氣。我遵循你正在嘗試做的邏輯,但是我一直認爲SAS處理的方式,它不能處理更多的命令一旦指定了輸出語句?任何其他建議,爲什麼這不起作用? – amy

+0

我已經用數據測試了第一種方法,它產生了你想要的輸出。有什麼問題? – user667489

+0

@ user667489,如果在第一個示例代碼中刪除了顯式的OUTPUT語句,它會產生什麼效果? – Alph

0

這樣的奇怪事情往往會發生爲了實現你的最終結果(刪除idr和日期與前一行相同的記錄),你可以輕鬆您可以在不創建額外列的情況下實現此目標提供數據按idr和date1排序,然後使用first.date1保留所需的記錄。

data have; 
input Idr Date1 :ddmmyy10.; 
format date1 ddmmyy10.; 
datalines; 
1 20/01/2016 
1 20/01/2016 
1 18/10/2016 
2 07/03/2016 
2 18/05/2016 
2 21/10/2016 
3 29/01/2016 
3 04/02/2016 
3 04/02/2016 
; 
run; 

data want; 
set have; 
by idr date1; 
if first.date1 then output; 
run; 
+0

嗨,感謝您的回覆。我遵循你的方法,但是我需要另一列來創建其他變量,如兩個日期之間的天數/月數等。最終我會到達將刪除記錄的階段,但我會在臨時階段使用它們來完成每個idr的計數等。 – amy

+0

好的,沒問題。請務必查看'dif'函數。這個工作方式像'滯後',但計算當前和以前的值之間的差異 – Longfish