2013-01-14 163 views
2

在這個數據步驟我不明白if last.y做什麼... 你能告訴我嗎?這是否意味着數據步驟?

data stop2; 
    set stop2; 
    by x y z t; 

if last.y; /*WHAT DOES THIS DO ??*/ 

    if t ne 999999 then 
     t=t+1; 
    else do; 
      t=0; 
     z=z+1; 
    end; 
run; 

回答

6

LAST.Y是指該行立即Y.這樣的值發生變化之前,在下面的數據集:將發生在第三,第六,第九

data have; 
input x y z; 
datalines 
1 1 1 
1 1 2 
1 1 3 
1 2 1 
1 2 2 
1 2 3 
1 3 1 
1 3 2 
1 3 3 
2 3 1 
2 3 2 
2 3 3 
;;;; 
run; 

LAST.Y ,以及該數據集中的第十二行(在Z = 3的每一行上)。前兩次是當Y將要從1變爲2,以及當它即將從2變爲3.第三次是當X即將改變時 - 當Y即將改變時,LAST.Y觸發或者當它在BY列表之前的任何變量發生變化時。最後,數據集中的最後一行總是LAST(無論如何)。

在上面的特定數據集中,子集if意味着您只爲每組Ys取最後一行。在此代碼:

data want; 
set have; 
by x y z; 
if last.y; 
run; 

你最終會得到以下數據集:

data want; 
input x y z; 
datalines; 
1 1 3 
1 2 3 
1 3 3 
2 3 3 
;;;; 
run; 

末。

如果你想看看FIRST和LAST的運作方式,你可以做的一件事就是使用PUT _ALL_;。例如:

data want; 
set have; 
by x y z; 
put _all_; 
if last.y; 
run; 

它會向您顯示數據集上的所有變量,包括FIRST。(無論)和LAST。(無論)。 (FIRST.Y和LAST.Y實際上是變量。)

+0

什麼是'first'和'在SAS究竟last'?某種物體?如果我嘗試做類似'ab = 6;'的錯誤'變量a不是一個對象。' – Tartaglia

+1

首先。(變量)和最後一個(變量)是特殊變量,當BY語句是用過的。爲什麼他們使用點符號我不知道。點符號也用於其他一些事情(例如,散列對象),但SAS並不完全一致。 – Joe

+0

@Joe:在last後回答我的問題。y'(可能發生多次,我確信這是)下一個if塊被執行,否則不會(如果不是'last.y')。正確嗎? – statquant

0

在SAS中,首先。最後。是在數據步驟中隱式創建的變量。 每個變量都會有第一個。和最後一個。對應於DATA步驟中的每條記錄。這些值將會變爲0或1. last.y與last.y = 1相同。

請參閱此處以獲取更多信息info

0

這是一個子集IF語句的例子。這與IF/THEN聲明不同。它基本上意味着如果條件不成立,則立即停止數據步驟的迭代。
所以

if last.y; 

相當於

if not last.y then delete; 

if not last.y then return; 

if last.y then do; 
    ... rest of the data step before the run ... 
end;