首页 > 代码库 > 数据处理之求和语句,retain语句

数据处理之求和语句,retain语句

先看下面的一个例子:

DATA A;
INPUT X Y @@;
S+X;
DATALINES;
3 5 7 9 20 21
PROC PRINT;
RUN;

衍生的新变量s为与x变量的求和,我们看结果

Obs X Y S

1 3 5 3
2 7 9 10
3 20 21 30

上面的S+X语句看上去怪怪的,能不能换成S=S+X;这样比较符合我们的变成习惯。那么将S+X;替换为S=S+X;后我们看结果:

Obs X Y S

1 3 5 .
2 7 9 .
3 20 21 .

结果出乎意料,这里的S变量的值全部为默认你缺失值.;或者根本就没对S变量进行赋值,原因是没有对S赋初值,既然这样那就对S变量赋初值0吧,加上S=0;这一语句试试:

Obs X Y S

1 3 5 3
2 7 9 7
3 20 21 20

结果是S变量的值与X的值完全一样,这是因为sas数据步读取数据是循环的过程,加上S=0;语句,实际上是每次循环时重新对S变量赋值为0,所以S变量的值会与X的值完全一样,要想S变量实现求和,并且能用S=S+X;该语句,这就要用到RETAIN语句的作用了;

DATA A;
INPUT X Y @@;
RETAIN S 0;
S=S+X;
DATALINES;
3 5 7 9 20 21
PROC PRINT;
RUN;

结果和第一段代码的结果一样;

这里,RETAIN S 0;语句相当于为S赋初值为0;但是和S=0;这一语句不一样的是:当数据部循环第二次读取数据时,会跳过RETAIN语句的执行,即循环时,S变量会一直保存计算值而不会被再次初始化。这就是RETAIN语句的作用。