3.9 使用retain和sum语句
当开始数据步的每一个观测值迭代时,SAS会先将所有变量值设为确实,再通过input和分配语句改变。Ratain和sum语句可以改变这种方式,
Retain语句 retain语句可以让SAS保存前一次变量的值。它可以出现在数据步的任何位置,基本形式为:
RETAIN variable-list;
也可以指定一个初始值,而不是用缺失值或前一次的值代替初始值
RETAIN variable-list initial-value;
Sum语句 SUM语句用于你想将一个表达式的值累加到一个变量上去时,基本形式为:
variable+expression;
这个语句将表达式的值赋给变量,同时将变量的值保留到下一次迭代。这个变量必须是数值型,且初始值为0。因此,语句等价于如下形式:
RETAIN variable 0;
variable=SUM(variable,expression);
例子 有一个关于本赛季棒球比赛的数据,games.dat,包含比赛日期、参赛队伍、hit数据、runs数据
现在需要增加两个变量,一个反应本赛季的总runs数,一个反应一场比赛中最大的runs数。下面的代码用sum语句实现总run数,用retain和max函数实现最大runs数:
变量maxruns取前面迭代的maxruns和runs中最大值;变量runstodate将每一场比赛的runs都加到自己身上。结果如下:
3.10 用数组简化程序
对于太多变量要处理的程序,数组将大大简化程序。
SAS中,数组是一组变量,变量可以是已存在的,也可以是新创建的。
数组在数据步中用ARRAY来定义,基本形式为:
ARRAY name(n) $ variable-list;
Name是数组名,n是变量数,()也可以用[]和{}代替。如果变量是字符串,则需要$,且变量是新创建的字符串时,$是必须的。变量名依照顺序排列,如数组:
ARRAY store(4) Macys Penneys Sears Target;
则store(1)是Macys,store(2)是Penneys,store(3)是Sear,store(4)是Target。
数组本身不储存在数据集中,只有在数据步中才被定义。命名规则与变量一样(不超过32字节,以字母、下划线开头,只能包含字母、数字、下划线)
例子 广播电台wbrk做了一份关于歌曲的听众调查,对10首歌进行打分,分值在1-5,如果没听过则填9。数据文件wbrk.dat包括了被访者姓名、年龄、以及十首歌的打分。
下面的代码将所有打分为9的改为缺失值:
十首歌被放入song的数组中。输出结果如下:
注意这里数组没有被保存到数据集中,而i被保存了。
3.11 列出变量名的快捷方式
如果想把100个变量放入数组,并不需要一个一个变量名的输入,有快捷方式可以列出变量名。
Number range lists 开始于同一个单词,结尾于连续的数字的,可以使用Number range list。比如:
Name range lists 这种列表是依据变量在数据集中的排列顺序来的,比如,创建如下数据步:
则变量的排列顺序就为:Y A C H R
那么可以依照这个顺序用“put 第一个变量--最后一个变量”来简化:
如果不能确定数据集中变量的顺序,可以用proc contents的postion选项来查看。下面的代码列出了永久数据集distance的变量顺序:
Special sas name list
例子 广播电台WBRK想要修改前面的代码(将9改为缺失值),使用mean函数计算平均分数:
程序中,当原始变量(domk-ttr)值为9时,song变量值为缺失值,否则就把原始变量的值赋给song变量。另外avgscore计算平均值: