char07.docx

上传人:b****4 文档编号:4930735 上传时间:2022-12-11 格式:DOCX 页数:15 大小:19.80KB
下载 相关 举报
char07.docx_第1页
第1页 / 共15页
char07.docx_第2页
第2页 / 共15页
char07.docx_第3页
第3页 / 共15页
char07.docx_第4页
第4页 / 共15页
char07.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

char07.docx

《char07.docx》由会员分享,可在线阅读,更多相关《char07.docx(15页珍藏版)》请在冰豆网上搜索。

char07.docx

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_语句。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1