先看下面的一个例子:
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语句的作用。