开发工具:
文件大小: 2mb
下载次数: 0
上传时间: 2019-03-23
详细说明:NULL
博文链接:https://xuan0506.iteye.com/blog/104158754循环语句和数组
197
data charity(dr
nate:
array contrib qtr1-qtr4:
contrib(0= contrib(*1.25
u门
在上述程序的循环过程中,生成了指标变量.它并不是最终结果所需要的,所以数据集
Charity后加了选项drop=i
若要计算各人每季度捐献占全年捐献的百分比.则可使用以下的程序.在这个程序中设
定数组 Percent时没有指定元素列,就使用缺省的元素列 percent1- Percent4.这4个变量在
数据步中还未设定,所以由系统缺省地生成4个数值型的变量.在最后的打印输出中,对表
示百分比的变量 Percent 1- Percent4使用含一位小数的百分数格式 percent7.1
data Percent(drop
set dst, donate
qtr1-9
array contrib qtrl-gtr4
doi=l to 4
percent(O= contrib(i/total
en
Pun
proc print data Percent noobs
title 'Contribution Percentages by quarter
format percentl-percen t4 percent.1
run
Contribution Percentage by Quarter
Drum
Name
Percent1 Percent2 Percent 3 Percent 4
1351
17.9%
21.4
25.0%
35.7
Chin
9.0%
3%
指定数组元亲列的初值
有时对数组的元素列设定它们的初值会是十分有用的.例如对数据集 Dst. Donate中各
个员工捐献值,要比较它们与以往各季度员工捐献平均值10,155,10向间的差异.可采用以下
的循环语句并建立相应的数组
198
第五章数据加工
ta goal(drop =i g1-g4)
et Dst. don at
array contrib(aatr1-gtr4
array differ(4)diff l-diff4:
array goa(4)g1g4(1015510)
doi=1 to 4
differin
ib{}g°a{}
run,
在以上的程序中,为了逐个季度比较捐献数和目标数间的差异,使用了数组( ontrib(表
示逐季捐献值)和数组(oa表示过去各个季度的平均值).数组Goal的变量g1-g4是新创
建的,它的值(10,5,5,10也是预定的,也不在数据集 Dst. Donate之中,语句 rray goa.(4)
g1g(10.15,,10):不仅设定了数组goal,也让数组的元素列glg在创建开始就分别取值
(10,15,5,10
提交以下的打印程序后就可得到数据集Goal
proc print data
title 'Difference between Contributions and goals
title2 'Quarterly Goals: $10 $15$5 S10
run
↓
Difference between contributions auld goals
y Goals:$10$15$5$10
Idnum Name Qtr1 Qtr2 Qtr3 Qtr diff diff2 diff3 diff4
1351
Farr
10
14
0
10
161
10
Chin
12
设定数组和它的初值的语句形式为:
ARAY数组名{个数}〈元素列)(韧值列;
在 ARRAY语气中,
数组元素列初值位」元素之后
·依次为每个元素没定一个初值
不同元素初值可用空格符隔开
整个初值列包含在一对圆括号之中
设定临时数组
在上面的例子中,数组Goal只是存储了各季度员工捐献平均值,它用于运算的中间过
程.在输出的数据集Goal中,并不需要这个数组的元素列.所以删除了变量g1g4.对这些
循环语句和数组
只在运算中间需要的变量列,可以设定为临时数组,创建它以后,只参加数据步执行过程的
运算,并不保留在数据集之中
设定临时数组的话句形式为:
ARAY数组名{个数}+emoy(匆值列)
使用临时数组,比较捐嗽值的程序可改写如下
goal(drop= i
t dst. don at
array contrib(4 qtrl-qtr4:
array differ(4 diff1-diff
array goal(4)-temporary-(10 15 5 10);
differ( i= contrib(]-goaHi]
end:
在上述程序中,由于数组Goa是临时的,它的元素列不保留在数据集之中,所以也不
必在数据集Goa加人删除这些元素的选项.由它可得到与前面程序同样的结果.
设定数组指标值范围
个数组的指标值未必由1开始.可以在没定数组时为其指标值规定任何范围
数据集 Lst sales5-0包含年至年各地区销售额
Saleg85 Sales86 Sales87 Sales88 Sales89 Sales90
5.8
6.1
7
7,3
West
5.1
5.7
7
.4
7.80
Central
若用语句 Array profit(6) Sales85 Sales90;将变量列Sale85-Sals9设定为数组 Profit
则引用数组变量 Profit(4)时为变量 Sales88.指标值由1至6依次对应年份85至90.这一对
应直观性较差.也可以使用以下的数组设定语句
array profit 85: 901 sales85-salesg0
使用这一句,指标值山85至90依次对应年份85至90.这个对应在编程中使用较为方便.
DIM函数
在使用语句 array test{tt;设定数组est后,函数DM(e)可以返数组包含
元素的个数.这一函数的用法就是
DM(数组名)
200
第五章数据加工
调用DM函数后返回数组元素的个数.使用DIM函数可以避免重复设定DO循环的终止
值.这样便于程序的修改和维护
两维数组
以上介绍的都是一维数组.有时需要将变量排列为矩形表格状的两维数组或更一般的多
维数组,例如要用数据步实现对测验卷的各个答题进行评阅,如果每题的回答(Rc6pi)只有
个正确的答案(ey),那么只要作简单一对一的比较
Respl→key1
Resp2→key2
Kev
Res p4
Key4
如果每个题目可以有三个正确的答案,那么每题的回答就要和多个正确答案(Keyj〕)进
行比较
Resp1→}Key1Key2key3
Resp2
Key4 Keys Keys
Resp3→Key7Key8Key9
Respa, Key10 Keyll key 12
用循环谱句来处理这一过程,就可以将表示止确结果的变量记为兩维数组.对维数组
可以想象为排成一行的变量
Keyl, key2, Keys, Key4, Keys, Key6, Key7, Key&, Key, Keylu keyll,Key12
对两维数组可以想象为排为多行的变量:
Keyl Key2 Key3
Key4 Keys Key
Key7 Keys Key9
Key10 Keyll Key 1
为了设定一个两维数组,可以使用下列形式的语句:
arrry new(4, 3 )Keyl-Key12
整个数组可以想象它排列为两维的矩形表.在设定两维数组的语句中,数组名后写入两
个维的长度,先是行这维的长度(有几行),后是列这一维的长度(有几列)每一维的长度值
间用逗号分开.在设定语句中列举数组元素列时,先是第行中各列的元素,再是以后各行
中各列的元素
引用两维数组时也在数组午后的括号中先后指明其行数和列数.多维数组常用于嵌套的
循环之中
例5.17某公司逐月的销售额存放在数据集 Dst. Monthly中,现要由此生成一个类似形式的
逐季销售额数括集
5.5写入SAS数据集和外部文件
201
Dataset Dst. Monthly
Year Man1 Mon2 Mon3 Mon4 Mon Mon6 Mon7 Mon8 Mon9 Hon10 Mon11 Mon12
198934
19902276
35
19914b3261b1
712b引
b
41
为了由月份销售额生成季度销售额,以下的程序中使用嵌套的循环,在内层的循环中,
实现每个季度三个月销售额的累加,在外层的循环中,实现对匹个季度的作,
data quarters(drop =ij mon 1-mon 12
set dst. monthly
array m(4, 3) mon l-mon 12
Dataset Work. Quarters
array Qutr(4)
do i= 1
Y
Qutr1
Qutr2 Qutra
Sutra
loi=I to 3:
qutr+ m(i j1);
15
end:
1990
339
304
344
338
1991
477
4
run
85.5写人SAS数据集和外部文件
在前几节介绍了如何用效据步程序读入SAS数据集或文本格式文件进行加工.在这
节将介绍如何控制加工结果的输出,将加工结果写为SAS数据集或文本帝式文件
351用 OUTPUT语句写人SAS数据集
在数据步中,控制一条记录写入新建SAS数据集的是 OUTPUT话句.在许多新建SAS
数据集的数据步程序中,虽然没有明显写出 OUTPUT语句.系统在执行数据步时会在数据
步的每个循环的最后自动地执行 OUTPUT语句的功能,将PDV的内容作为一条记录写入
新建的数据集.例如下面左侧的程序是将 OUTPUT语句明显地写入数据步,它在功能上是
完全等价于右侧的程序
ata Class
set sashelp class
data Class
ratio= weig ht height
et sashelp, class:
ratio weight height
output:
run
run
明显使用 OUTPUT语句
在数据步程序中,如果要在执行过程的某处将当时PDV内容写人新建的数据集,就
可使用 OUTPUT语句.它的一般用法就是
OUTPUT〈SAS数据集》;
202
第五章数据加工
OUTPUT语句的功能就是将PDV的内容作为一条记录写入所指明的SAS数据集.如果在
OUTPUT语句中不写明SAS歉据集,则就写入DAIA语句指定的数据集
若在数据步中使用了 OUTPUT语句,则系统不再加入自动执行的 OUTPLT功能
在数据步中使用OTPT语句可以:
将读入的一条记录写入多个观测
将读入付记录写人多个数据集
在没有输入时将生成的结果写入SAS数据集
例5.18数据集 Dst. Employee-data包含了某航空公司全部飞行员的信息,其中变量 Emp_Id
和 Emp_salary分别为工号和年薪.现在公司决定以后三年每年提薪5%.为此要生成下面右
侧形式约数据集
Dat aset Dst. Employee_data
Obs EMP_ID New_salary Ys
mp_id Emp_salary
1E00901S26,25000
EMP ID EMP SALARY
s27,562.50
2
3E00001S28,940.63
E0o001
25,000
4E00002S28,350.00
E0O002
27,000
E00
s29,767,50
2
E00002s31:255.88
为了生成上述右侧的数据集,要将源数据集的每条记录的字段 Dmp_Salary乘以105作
为新的年薪 New salary.以后各年又将上一年的年薪再乘15作为当年的年薪,在完成年薪
计算后,就用 OUTPUT语句将PDV中的内容写入新建数集的一条记录.山于要对连续
的三年进行同祥的运算,所以使用循环语句.以下就是这一段程序
ses(Keep
id Year New salal
set dst. Employee_data
ew_salary
sala
new_salary new_salary+ 1.05
end
run?
同时生成多个SAS数据集
数集 Dst. Employee_dat中变量Emp( ountry表示廂员的国籍.现要将国籍在北美国
家,欧洲国家,亚洲国家和其它国家的飞行员分别建立4个数据集.为了完成这一任务,可
以用在源数据集选取子集的方法每次将国籍在某一个洲的飞行员生成一个子集,这样需要编
写多个程序步.事实上,也可以用一个数据步实现上述任务.为了在一个数据步巾生成多个
数据集.数据步的DATA语付后就需要列举多个需要生成的数据集的名称
DATA数据集1数据集2…;
和用数据步的这一功能,可以用以下的程序由 Dst. Employee_data生成多个国籍在各洲
5.5写入SAS数据集和外部文件
203
的飞行员的数据集
data N_Amer Euro Asia Others
set Dst. Employee data
if emp _country in (USA,CAN ADA)then output N_Amer
else if emp_country in('GERMANY, 'UNITED KINGDOM, DENMARK, ' FRANCE)
then output Euro
else if emp_country in( JAPAN, SINGAPORE then output Asia
else output Others
提交上述程序后,在Iog窗口会显示如下的信息,表明程序由含有450条记录的数据集
生成了4个分别含有365,62.15和8条记录的数据集
LOG信息
NOTE: There were 450 observat ions read from the data set dst. EMPLoyEe data
NOTE: The data set horkN AMeR has 365 observations and 10 variables
NoTE The data set woRK. euro has 62 observat ions and 10 variables
NOTE: The data set horK AsIA has 15 observat ions and 1o variables
NOTE: The data set wORK. oTHERS has 8 observat ions and 10 variables
SELECT语句
在数据步中,进行多项选择时,除」可以多次使用 IF-THEN-ELSE语句外,还可以使
用 SELECT讦句.两者有相同的教果
SELECT语句的形式为:
SELECT〈选择表达式}
WHEN(表达式)语句;
WHEN(表达式)语句;
( OTHERV|SE语句;〉
END
其中选择表达式和表达式都是SAS表达式.在执行 SELECT语句时,将选择表达式代
入各个WHEN语句后的表达式,若表达式成立,则将执行其后的语句. OTHERWISE语句
是可以省略的.但没有 OTHERWISE语句时,当每个WHEN语句郁不成立,数据步将终止
并显示出错信息
若在满足WHEN后的表达式时要执行多个语句,也可使用D()END括号而让程序执
行一个语句组.其一般形式为
204
第五章数据加工
SELECT〈选择表达式};
WHEN(表达式)DO
语句组
END:
HEN(表达式)DO
语句组;
END
OTHERWISE DO:
语句组
END
END
在上述分拆数据集 Dst. Employee_data的例子中,若使用 SELECT语句,就是以下可以
得到同样结果的程序
data N_Amer Euro Asia Others
set Dst. Employee_data
select(emp_country);
then CUSA,CANADA )output N_Amer
when (GERMANY, 'UNITED KINGDOM,, 'DENMARK, 'FRANCE)output Euro
when(JAPAN. 'SINGAPORE')output Asia
output Oth
Tur
在使用 SELECT语句时,若按照某个变量在不同范围取值选择运行不同的语句,则可
以按如下的形式编写 select语句的程序
select
when(emp salary>0 and emp_salary 20000)raise= emp_salary *1.09
when(emp salary>= 20000 and emp salary 50000)raise emp salary+1.06
otherwise raise= emp_sa lary+1. 02
使用循环语句生成数据
使用数据步生成SAS数据集,不仅可以由读入已有的SAS数据集或文本文件加工生成,
也可以依靠循环话句直接生成数据例如以下的数据步程序就可以生成(规则的数据.在以
下的数据步程序中,并没有读入SAS数据集或外部文本格式文件,所以数据步的白身循环
是由循环语句控的.在这个程序中,x为循环的指标变量.在循环体中,两个赋值语句为
变量Y和2賦了值. OUTPUT语句将PDV中X,Y,Z三个变量的值写入数据集TRY的
一条记录.指标变量山1至10循环了10次,所以在数据集TRY就生成了10条记录
这是用程序生成数据集最常用的做法
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.