R2 | #30天专注橙长计划#~SAS~Day 16

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数据

R2 | #30天专注橙长计划#~SAS~Day 16_第1张图片

现在需要增加两个变量,一个反应本赛季的总runs数,一个反应一场比赛中最大的runs数。下面的代码用sum语句实现总run数,用retain和max函数实现最大runs数:

R2 | #30天专注橙长计划#~SAS~Day 16_第2张图片

变量maxruns取前面迭代的maxruns和runs中最大值;变量runstodate将每一场比赛的runs都加到自己身上。结果如下:

R2 | #30天专注橙长计划#~SAS~Day 16_第3张图片

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的改为缺失值:

R2 | #30天专注橙长计划#~SAS~Day 16_第4张图片

十首歌被放入song的数组中。输出结果如下:

R2 | #30天专注橙长计划#~SAS~Day 16_第5张图片

注意这里数组没有被保存到数据集中,而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函数计算平均分数:

R2 | #30天专注橙长计划#~SAS~Day 16_第6张图片

程序中,当原始变量(domk-ttr)值为9时,song变量值为缺失值,否则就把原始变量的值赋给song变量。另外avgscore计算平均值:

R2 | #30天专注橙长计划#~SAS~Day 16_第7张图片

你可能感兴趣的:(R2 | #30天专注橙长计划#~SAS~Day 16)