char07.docx
《char07.docx》由会员分享,可在线阅读,更多相关《char07.docx(15页珍藏版)》请在冰豆网上搜索。
char07
例7.1赋值语句举例。
procsortdata=fdata.class;
bysex;
dataa;
setfdata.class;
bysex;
n=_N_;
error=_error_;
first_s=first.sex;
last_s=last.sex;
procprint;
run;
x=a+b;/*规定新变量x,它是a和b的和*/
t
(2)=sum(ofx1-x5);/*规定数组元素,它的值是一函数值*/
a=a+b;/*规定一个已经存在的变量a,它的值为原来值和b之和*/
例7.2第一扫描结果的长度不是所有数据中的最大长度时会出错。
dataa;
stocd='0001';/*第一扫描结果的长度为4*/
stocd='600001';/*stocd的长度为4,所以显示结果为stocd=6000*/
procprint;
run;
例7.3用LENGTH语句得到正确输出结果。
dataa;
lengthstocd6;
stocd='0001';
stocd='600001';
procprint;
run;
例7.4累加语句等于使用SUM函数和一个RETAIN语句。
dataa(keep=nameheights_h);
setfdata.class;
s_h+height;
procprint;
run;
dataa(keep=nameheights_h);
setfdata.class;
s_h=sum(s_h,height,0);
retains_h0;
run;
上面两段程序等价。
例7.5表达式SUMX+X*X把X*X的结果加到SUMX上。
dataa(keep=dateuss);
setfdata.r_day;
uss+r600600**2;/*USS为变量r600600的平方和*/
run;
例7.6计算非缺失值的观测个数。
dataa(keep=nmis);
setfdata.indcls;
nmis+sector^=’‘;
run;
例中,NMIS为变量SECTOR非缺失值的观测个数,即按SECTOR分好类股票的个数。
例7.7删除部分观测值。
dataa;
setfdata.class;
ifsex=’F’thendelete;
run;
例中,删除数据集FDATA中SEX=F的观测值。
例7.8清空数据集。
dataa;
seta;
delete;
run;
例中,删除数据集A中的所有观测值,即清空数据集A。
设计复杂程序时,常会用到DELETE语句的这种用法。
例7.9每个数据行都有一个同值的识别变量。
dataa;
inputid1-3reject#2idc1-3pass;
ifidneidcthendo;
put‘数据行错误’id=idc=;
lostcard;
end;
cards;
30132
30161432
30253
30283171
40092845
41146
41199551
;
procprint;
title2‘每个观测包含两个数据行’;
run;
例中,二个输入数据行组成一个观测。
每行的1-3列包含一个识别数字。
当变量id所在的数据行的识别数字不等于变量idc所在数据行的识别数字时,说明有一个数据行被丢失或遗漏了,这时通过PUT语句输出信息并执行LOSTCARD语句。
此例中第三个观测(idc=400)的第一个数据行(即id变量所在的行)丢失了。
例7.10每个观测包含3个数据行。
dataa;
inputid1x$#2id2y$#3id3z$;
ifid1neid2orid2neid3thenlostcard;
cards;
101A
102B
102B
103C
103C
103C
104D
105E
105E
105E
;
procprint;
title‘每个观测包含3个数据行’;
run;
例中,DATA步读3个数据行作为1个观测。
第1个观测有2个丢失记录,第2个观测有1个丢失记录,第4个观测丢失2个记录。
只有第3和第5个观测是完整的观测。
LOG窗口显示的信息:
NOTE:
LOSTCARD.
RULE:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
5101A
6102B
7102B
NOTE:
LOSTCARD.
8103C
NOTE:
LOSTCARD.
9103C
NOTE:
LOSTCARD.
11104D
12105E
13105E
NOTE:
数据集WORK.A有2个观测和6个变量。
例7.11停止处理DATA步。
dataB_shares;
infile"d:
\fdata\B_shares.txt"firstobs=2;
inputhstocd$shrsdtshrout;
formathstocd$8.shrsdtyymmdd10.shrout16.;
informathstocd$8.shrsdtyymmdd10.shrout16.;
if_n_=21thenstop;
procprint;/*OUTPUT窗口照常打印数据集列表*/
run;
上面程序也可以用下面一段程序替代:
dataB_shares;
infile"d:
\fdata\B_shares.txt"firstobs=2obs=21;
inputhstocd$shrsdtshrout;
formathstocd$8.shrsdtyymmdd10.shrout16.;
informathstocd$8.shrsdtyymmdd10.shrout16.;
procprint;
run;
例中,STOP语句不影响后面任意DATA或PROC的执行。
在STOP语句之后继续执行出现的DATA或PROC语句。
例7.12ABORT语句防止输入无效数据时出错。
dataa;
inputssnpay;
if_error_thenabort;
cards;
111100
aaa200
444300
;
procprint;
run;
例中,如果数据行出错,自动变量_error_置为1。
如果发现错误,SAS停止处理这些观测。
例中,第二个数据行变量ssn包含了无效数据(aaa)。
当SAS读这个数据行时,它置_error_为1并执行abort语句。
上面数据集只有一个观测。
例7.13控制选择观测时的应用。
dataa;
don=3,5,7,4;
setfdata.classpoint=n;
if_error_=1thenabort;
aaa=_error_;
output;
end;
stop;
run;
例7.14BETWEEN-AND算符和ISMISSING|ISNULL算符例句。
Wherehstocdbetween600000and600899;
Wheretaxesbetweensalary*0.30andsalary*0.50;
Wheretaxesnotbetweensalary*0.30andsalary*0.50;
Whereidnumismissing;/*计算缺失值数目*/
Wherenameisnull;
LIKE算符的两个特殊模式:
•百分号(%)可以替代任意多个字符;
•下划线(_)正好有一个字符与之匹配。
进行比较时,LIKE算符识别大写和小写之间的字符。
例7.15设有名字Diana,Diane,Dianna,Dianthus,Dyan.使用LIKE算符来选择第一个字符为D的名字时,LIKE算符的不同选择模式与结果如下。
Like‘D_an’;/*选择Dyan*/
Like‘D__an_’;/*没有名子被选上*/
Like‘D_an__’;/*Diana,Diane,Dianna,Dyan*/
Like‘D_an%’;/*上述列表的所有名字*/
Notlike‘D_an%’;/*没有名子被选上*/
实现程序:
data;
setfdata.wherelike;
wherenameLike'D_an';
putname;
run;
data;
setfdata.wherelike;
wherenameLike'D__an_';
putname;
run;
data;
setfdata.wherelike;
wherenameLike'D_an__';
putname;
run;
data;
setfdata.wherelike;
wherenameLike'D_an%';
putname;
run;
data;
setfdata.wherelike;
wherenameNotlike'D_an%';
putname;
run;
例7.16使用算符SAME-AND来增加较多的从句到程序中已有的WHERE语句后面,而不需要重新打入原来的从句。
procgplotdata=fdata.a1a0001;
plotclpr*date=1;
whereyear(date)>1996;
wheresameandyear(date)<2000;
run;
quit;
例7.17选择数值变量非0和非缺失的观测值。
Wherex;
Wherexandy;
Wherex/y;
例7.18选择字符变量非缺失的观测。
Wherec^=’’;
wherecisnotmissing;
字符变量C不能单独地作为逻辑表达式。
例7.19选择一定范围内的观测。
Wherexbetween1and5;
where1<=x<=5;
例7.20选择其中一个观测。
Wherexin(1,2,3,4,5);
例7.21不能用WHERE语句的情况。
dataa;
setfdata.a000001;
where_n_<1000;/*错误语句,必须用if*/
run;
dataa;
setfdata.a000001;
if_n_<1000;
run;
例中,不能用WHERE语句控制SAS的自动变量时。
例7.22由一个输入数据行创建多个观测。
dataA;
inputID$score1-score3;
dropscore1-score3;
score=score1;output;
score=score2;output;
score=score3;output;
cards;
02126999694
02128899088
;
procprint;
run;
例中,每一行记录生成三个观测。
每个新观测将包括代号ID和一次测验值SCORE.
例7.23一个DATA步创建多个数据集。
dataFM;
setfdata.class;
ifsex=’F’thenoutputF;
elseifsex=’M’thenoutputM;
run;
例中,一个DATA步创建两个数据集。
数据集F包含变量SEX为’F’的所有观测;数据集M包含变量SEX不是’F’的所有观测。
例7.24一个DATA步创建多个数据集。
dataage1age2;
inputname$age;
ifage<15thenoutputage1;
elseoutputage2;
cards;
Alice13
Gail14
Mary15
Sandy11
Philip16
Robert12
Thomas11
William15
;
run;
例中,一个DATA步创建两个数据集。
数据集AGE1包含变量AGE<15的所有观测,数据集AGE2包含变量AGE>=15的所有观测。
例7.25由几个记录组合信息。
procsortdata=fdata.dd_c;
bydate;
dataa;
setfdata.dd_c;
bydate;
iffirst.datethensum_c=0;
sum_c+sum;
keepdatesum_c;
iflast.datethenoutput;
run;
例中,对数据集计算1999年活期每日存款总额。
这样的方法是不是简单快捷。
这个例子很有用,从这里也认识了自动变量:
first.date和last.date的使用方法。
数据处理时用这个语句会很省力。
例7.26上例可以用MEANS过程来实现。
procsortdata=fdata.dd_c;
bydate;
procmeansdata=fdata.dd_cnoprint;
bydate;
varsum;
outputout=sumsum=sum_c;
run;
例7.27从某个SAS数据集中移走一个观测。
datafdata.accounts;
inputacctnumcredit;
cards;
10011500
10024900
10033000
;
datafdata.Accounts;;
modifyfdata.Accounts;
ifacctnum=1002thenremove;/*移走acctnum=1002的观测*/
procprintdata=fdata.Accounts;
title’EditedDataSet’;
例7.28应用举例。
datamaster;
inputname$id$phonenum;
cards;
Kevin11001003750066
Sandi110000013756666
Cindy110000026758966
Jim110000036750088
;
datatrans;
inputname$id$phonenum;
cards;
.110010083750066
.1100000183756666
Vivan2100000183750387
;
datamaster;
modifymastertrans;
byid;
if_iorc_=%sysrc(_sok)thenreplace;/*在master中找到观测进行替代*/
elseif_iorc_=%sysrc(_dsenmr)thendo;
error=0;_iorc_=0;output;
end;
run;
procprintdata=master;
title'含有新电话号码的数据集MASTER';
run;
例中,用数据集TRANS中的值更新数据集MASTER中的电话号码,增加一个观测到数据集MASTER的结尾。
SYSRC对MASTER每次试图重新得到一个_IORC_的值,自动调用宏检验。
例7.29规定缺失值字符。
dataperiod_a;
missingXI;
inputId$4.Foodpr1Foodpr2Foodpr3Coffeem1Coffeem2;
datalines;
10011154565I78
10028627557286
10049352X7688
1015733543112108
1027101127397679
;
例中,MISSING语句规定用字符X和I表示缺失值。
如果不用MISSING语句,当读入数值变量的缺失值时(这里为X和I),就要产生错误。
例7.30用INPUT语句读入可疑数据行时使用LIST语句。
dataa;
inputxy;
ifx<0thenlist;
cards;
26
42
-12
-46
;
run;
例7.31产生声音。
data_null_;
callsound(20,800);/*每秒产生20次声音,每次时间为800*1/80秒*/
run;
例中,频率为20,即每秒发生20次。
持续时间为800*1/80秒。
例7.32创建包含DATA信息的宏变量。
dataa;
callsymput(‘text1’,‘march’);/*将march赋给宏变量text1*/
callsymput(‘beta’,100);/*将100赋给宏变量beta*/
run;
procregdata=fdata.r_monthoutest=estnoprint;
modelr600600=rm;
dataest;
setest;
callsymput(‘beta01’,intercept);/*创建一个值来自DATA步的宏变量beta01*/
callsymput(‘beta11’,rm);/*创建一个值来自DATA步的宏变量beta11*/
callsymput(‘sigma1’,_rmse_);
run;
例7.33发布操作系统命令。
data_null_;
callsystem('dir*.sas');/*发布和操作系统命令dir*.sas*/
run;
例7.34空语句表示数据行结束。
dataa;
inputxyz;
ifx=.Thengotofind;
list;
find:
;
dropx;
cards;
125
.13
258
.39
;
procprint;
run;
在这个DATA步,CARDS语句告诉SAS系统在这个作业流中,紧跟着的是数据行,当SAS遇到空语句(;)时,就知道数据行结束了。
上例中的空语句也可以省略,因数据行后面第一个语句(PROCPRINT;)中包含一个分号。
例7.35应用举例。
dataa;
inputname$type$age;
iftype='teen'&age>19thenerror'typeandagedon"tmacth'age=;
cards;
Wuteen20
Liteen12
Cindyadult28
;
dataa;
inputname$type$age;
iftype='teen'&age>19thendo;
put'typeandagedon"tmacth'age=;
_error_=1;
end;
cards;
Wuteen20
Liteen12
Cindyadult28
;
run;
上面两段程序的结果相同。
第一段用ERROR语句,第二段用PUT和_ERROR_语句。