2017-02-18 22 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