继续之前的读书笔记,本次讲解sas主要的变量操作,包括基本赋值语句、累加语句、keep语句、retain语句、array语句、rename语句、length语句。
1.基本赋值语句
z=x y;
z=sum(x,y);
2.如果表达式中既有数值型变量又有字符型变量的话,则会将字符型变量转化为数值型变量
3.系统在编译阶段,对于赋值语句变量,如果是字符型变量则长度为1,如果是数值型变量则长度为8,接下来,系统将执行赋值语句,这时变量长度将由第一次读入的表达式的运算结果决定。一旦第一次读入确定长度之后,下一次pdv无论读入多长的数据,都不会改变变量的长度。除非提前用length语句限定变量的长度。
4.累加语句
x 1,x (-1)都是累加语句,其中x必须是数值型变量,在编译阶段,pdv自动设置累加变量值为0,它的值从当前执行后一直保留在pdv中,直到下一次执行为止。
在项目实践中,一般用retain语句替代累加语句,因为retain语句可以初始化累加变量为一个非零值,而累积语句初始值只能为0.
5.keep语句(keep语句不是可执行语句)
Data a3;
Run;
Data a4(keep=name x);
Run;
以上两个程序输出结果一样,
但是对于读入数据集时,keep=的形式性能要远高于keep的形式,因为keep=的形式是仅限后面的变量进入pdv,对于拥有几百个变量的数据集而言,keep=效率要高;
不过对于数据输出方面,keep=与keep性能没有区别;上面两个语句性能完全一样。
6.retain语句(不是一个可执行语句)
pdv运行规律:data语句与run语句构成了一个循环语句,一般情况下每读一遍data步所有语句时,pdv都会清空所有变量值,并设置为缺失值。然后根据执行语句,再次对变量进行赋值。当data步使用retain语句时,pdv则不会清空retain语句对应变量,而是一直保留直到下次该变量再次执行。
retain语句在data步中有着广泛的应用,对于数据集的操作可以到单元格,而一般函数只能操作到列,实际应用中retain会使程序更加灵活化。可以控制一个变量的值不变,除非有外部的条件的变化而变化。
retain语句主要实现以下需求:
汇总数据,累加变量,纵向比较变量,创建flag标识变量,处理缺失值,迭代累加字符变量值。
Eg:关于汇总数据的一个例子(按照每个id,汇总cns的值,汇总id的记录数,如果txn_cde变量取101和201两个值,则累加计算一次,计算txn_dte的最小值,)
libname chapt4 "f:\data_model\book_data\chapt4";
data chapt4.retain1;
input id txn_cde$ cns txn_dte$;
cards;
10 101 10 20070101
10 101 20 20080402
10 201 30 20050203
20 101 40 20040105
20 201 50 20040105
20 301 60 20070806
20 201 70 20050607
30 301 80 20070501