先看下面的一个例子:
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语句的作用。
数据处理之求和语句,retain语句,布布扣,bubuko.com
原文:http://www.cnblogs.com/bowenlearning/p/3728991.html