2013-12-14 51 views
1

正如蜜蜂看到的,​​我通過RK排序的數據,降版本:保存狀態,也許通過保留聲明

data have; 
rk = 1; 
version = 7; 
ind = 0; 
output; 
rk = 1; 
version = 6; 
ind = 1; 
output; 
rk = 1; 
version = 5; 
ind = 0; 
output; 
rk = 1; 
version = 4; 
ind = 0; 
output; 
rk = 1; 
version = 3; 
ind = 1; 
output; 
rk = 1; 
version = 2; 
ind = 0; 
output; 
rk = 1; 
version = 1; 
ind = 0; 
output; 
rk = 1; 
version = 0; 
ind = 0; 
output; 
run; 

我認爲保留聲明。但任何解決這個問題的方法都適合我。 我需要做的是, 如果在某個時候ind = 1,我想要所有先前的行(版本)爲同一個rk,有某種指示。

因此,基本上, 版本0,1,2應該被標記,因爲版本3的ind = 1;

版本4,5應該被標記,因爲版本6具有ind = 1;

但是版本7根本不應該受到影響,因爲它在行ind = 1, 之後出現,並且不在它們之前。

它甚至會更好,如果受到與IND一排每排標記= 1 將有一個指示燈狀態的版本號是受到影響的變化, 意味着0,1,2 版本將有一場名爲「affected_by 「等於3 版本4,5將具有該字段等於6

您的幫助非常感謝!

+0

你確定你想要所有「之前」的行嗎?因爲現在你的數據集看起來像這樣:http://puu.sh/5M7Mj.png這看起來更像是你想要所有後續行(之後)。 –

+0

那麼,我按照這種方式對數據進行了排序,因爲我認爲這是解決方案的一部分......當然,您可以對其進行分類,但您認爲合適。我確實需要所有「之前的行」。是。謝謝! – user2518751

回答

1

由於數據集已排序,我們將使用已排序的集合「前進」(我認爲這更容易)。我們將使用SELECT語句,因爲我們只需要每次迭代執行一次。我們也將使用RETAIN聲明,您已經提出並用於連接字符串一起生成指標flagCAT功能:

data test; 
    set have; 
    drop N count x; 

    select; 
     when(ind = 1) do; 
      N = 1; 
      count = version; 
      retain N count; 
      output; 
     end; 

     when(N = 1) do; 

      x = ind; 
      flag = cat('Flagged because of version ', count); 
      N = .; 
      retain x count; 
      output; 
     end; 

     when(x = ind) do; 
      flag = cat('Flagged because of version ', count); 
      retain x count; 
      output; 
     end; 
     otherwise do; 
      output; 
     end; 
    end; 

run; 

OUTPUT:

    rk version ind    flag 

        1  7  0 
        1  6  1 
        1  5  0  Flagged because of version 6 
        1  4  0  Flagged because of version 6 
        1  3  1 
        1  2  0  Flagged because of version 3 
        1  1  0  Flagged because of version 3 
        1  0  0  Flagged because of version 3 

在這種情況下,N用作然後我們將它摧毀(即N =。),否則它將在下一次迭代中再次滿足N = 1的條件。

請注意,我們保留變量xcount,用於比較x與下一個ind。變量count等於ind = 1的行中的版本。對於標誌指示器,使用CAT函數將數字變量count添加到字符串中。

乾杯。

+0

Awsome !!!非常感謝你!順便說一句,你是如何學習如此編程的......? – user2518751

+0

我很高興我的幫助。我在大學/大學參加了SAS基礎編程課程,該課程準備SAS考試認證專業(基礎編程)考試。但我還沒有參加考試.. 我學到的大部分內容都來自於在線閱讀SAS論文,尤其是全球論壇論文。我其實從來沒有讀過SAS書,因爲我認爲這是一個騙局,因爲他們是唯一製作書籍的公司。我在C,Matlab和Python方面有一些編程經驗,所以它使SAS更容易學習。 –

+0

再次感謝您的回覆。您能否提一下常規If語句和您使用的Select語句之間的區別? – user2518751