2017-02-18 27 views
0

我有以下形式SAS,如何運行索引「通過行做」循環?

ID BookingDate Releasedate 
1  1/1/11  1/3/14 
2  3/3/12   1/4/17 
. 
. 
. 

數據(ID是一個字符變量)

的數據以這種方式繼續進行。

我所試圖做的是建立一個循環如下:

If id(i) = id(i+1) AND 
    BookingDate(i) = Bookingdate(i+1) AND 
    Releasedate(i) NE ReleaseDate(i+1) 
     Then 
     Releasedate(i) = Max(ReleaseDate(i), Releasedate(i+1)) 
    Else 
     Releasedate(i) = Releasedate(i) 

這將是對於i = 1(行數)

注意,我的語法是僞這裏。

一切我讀過有關陣列看起來它工作在列,一行一行。

謝謝!

+0

SAS從上到下一行一次讀取數據,因此在您的示例中不需要索引。然而,這意味着你無法查看你(容易)前值,但可以使用滯後()函數與以前的值進行比較 - http://support.sas.com/documentation/cdl/en/ lrdict/64316/HTML /默認/ viewer.htm#a000212547.htm –

+0

什麼是你真正嘗試計算?你能用文字來形容它嗎?它看起來像是你想在每個預訂日期內找到最大的發佈日期。 – Tom

回答

1

使用保留和LAG找到以前的值。 沒有得到測試的機會,但相當肯定這會工作。你可以簡化MAX條件。

Data want; 
Set have; 

Retain Latest_RDate; 

Prev_id = lag(Id);  
Prev_bdate = lag(bookingdate); 
Prev_rdate = lag(ReleaseDate); 

If Id = (prev_Id + 1) and bookingDate = (prev_bdate + 1) and 
     ReleaseDate ne (Prev_RDate + 1) then Latest_Rdate = max(releasedate, prev_Rdate, Latest_Rdate); 
    Else latest_Rdate = RealeaseDate; 

    Run; 
+0

謝謝。這並沒有完成我需要的工作,但給了我需要的輪廓。用於R時很難與SAS一起工作... – Redeyes10

+1

它們是不同的編程語言。 SAS的快速訣竅,認爲它一次處理一行,而R通常使用矩陣類型的數學函數。但它通常意味着相同的代碼適用於10k和1000萬行。如果你想要R類型的功能使用IML,這更相當於R. – Reeza