1、上面两段程序等价。例7.5 表达式SUMX+X*X把X*X的结果加到SUMX上。data a (keep=date uss);set fdata.r_day;uss+r600600*2; /*USS为变量r600600的平方和 */例7.6 计算非缺失值的观测个数。data a(keep=nmis);set fdata.indcls;nmis+sector= ;例中,NMIS为变量SECTOR非缺失值的观测个数,即按SECTOR分好类股票的个数。例7.7 删除部分观测值。if sex=F then delete;例中,删除数据集FDATA中SEX=F的观测值。例7.8 清空数据集。set a;
2、delete;例中,删除数据集A中的所有观测值,即清空数据集A。设计复杂程序时,常会用到DELETE语句的这种用法。例7.9 每个数据行都有一个同值的识别变量。input id 1-3 reject #2 idc 1-3 pass;if id ne idc then do;put 数据行错误 id= idc=;lostcard;end;cards;301 32301 61432302 53302 83171400 92845411 46411 99551title2 每个观测包含两个数据行;例中,二个输入数据行组成一个观测。每行的1-3列包含一个识别数字。当变量id所在的数据行的识别数字不等于
3、变量idc所在数据行的识别数字时,说明有一个数据行被丢失或遗漏了,这时通过PUT语句输出信息并执行LOSTCARD语句。此例中第三个观测(idc=400)的第一个数据行(即id变量所在的行)丢失了。例7.10 每个观测包含3个数据行。input id1 x $ #2 id2 y $ # 3 id3 z $;if id1 ne id2 or id2 ne id3 then lostcard;101 A102 B103 C104 D105 Etitle 每个观测包含3个数据行;例中,DATA步读3个数据行作为1个观测。第1个观测有2个丢失记录,第2个观测有1个丢失记录,第4个观测丢失2个记录。只有
4、第3和第5个观测是完整的观测。LOG窗口显示的信息:NOTE: LOST CARD.RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+-05 101 A6 102 B7 102 B8 103 C9 103 C11 104 D12 105 E13 105 E 数据集 WORK.A 有 2 个观测和 6 个变量。例7.11 停止处理DATA步。data B_shares;infile d:fdataB_shares.txt firstobs=2 ;input hstocd $ shrsdt shrout;format hstocd $8. shrsdt yym
5、mdd10. shrout 16.;informat hstocd $8. shrsdt yymmdd10. shrout 16.;if _n_=21 then stop; /*OUTPUT窗口照常打印数据集列表 */上面程序也可以用下面一段程序替代:fdataB_shares.txt firstobs=2 obs=21 ;例中,STOP语句不影响后面任意DATA或PROC的执行。在STOP语句之后继续执行出现的DATA或PROC语句。例7.12 ABORT语句防止输入无效数据时出错。input ssn pay ;if _error_ then abort;111 100aaa 200444
6、300例中,如果数据行出错,自动变量_error_ 置为1。如果发现错误,SAS停止处理这些观测。例中,第二个数据行变量ssn包含了无效数据(aaa)。当SAS读这个数据行时,它置_error_为1并执行abort语句。上面数据集只有一个观测。例7.13 控制选择观测时的应用。do n=3,5,7,4;set fdata.class point=n;if _error_=1 then abort;aaa=_error_;output;stop;例7.14 BETWEEN-AND算符和IS MISSING|IS NULL算符例句。Where hstocd between 600000 and 6
7、00899;Where taxes between salary*0.30 and salary*0.50;Where taxes not between salary*0.30 and salary*0.50;Where idnum is missing; /*计算缺失值数目 */Where name is null;LIKE算符的两个特殊模式:百分号(%)可以替代任意多个字符;下划线(_)正好有一个字符与之匹配。进行比较时,LIKE算符识别大写和小写之间的字符。例7.15 设有名字Diana,Diane, Dianna, Dianthus,Dyan. 使用LIKE算符来选择第一个字符为D的
8、名字时,LIKE算符的不同选择模式与结果如下。Like D_an; /* 选择Dyan */Like D_an_; /* 没有名子被选上 */Like D_an_; /* Diana, Diane, Dianna, Dyan */Like D_an%; /*上述列表的所有名字 */Not like D_an%;实现程序:data;set fdata.wherelike;where name Like D_anput name;D_an_D_an_D_an%where name Not like 例7.16 使用算符SAME-AND来增加较多的从句到程序中已有的WHERE语句后面,而不需要重新打
9、入原来的从句。proc gplot data=fdata.a1a0001;plot clpr*date=1;where year(date)1996;where same and year(date)2000;quit;例7.17 选择数值变量非0和非缺失的观测值。Where x;Where x and y;Where x/y;例7.18 选择字符变量非缺失的观测。Where c= ;where c is not missing;字符变量C不能单独地作为逻辑表达式。例7.19 选择一定范围内的观测。Where x between 1 and 5;where 1=x=5;例7.20 选择其中一个
10、观测。Where x in(1, 2, 3, 4, 5);例7.21 不能用WHERE语句的情况。set fdata.a000001;where _n_1000; /*错误语句,必须用if */if _n_例中,不能用WHERE语句控制SAS的自动变量时。例7.22 由一个输入数据行创建多个观测。data A;input ID $ score1- score3;drop score1- score3;score=score1; output;score=score2;score=score3;02126 99 96 9402128 89 90 88例中,每一行记录生成三个观测。每个新观测将包括
11、代号ID和一次测验值SCORE.例7.23 一个DATA步创建多个数据集。data F M;if sex=F then output F;else if sex=M then output M;例中,一个DATA步创建两个数据集。数据集F包含变量SEX为F的所有观测;数据集M包含变量SEX不是F的所有观测。例7.24 一个DATA步创建多个数据集。data age1 age2;input name $ age;if age 15 then output age1;else output age2;Alice 13Gail 14Mary 15Sandy 11Philip 16Robert 12T
12、homas 11William 15数据集AGE1包含变量AGE=15的所有观测。例7.25 由几个记录组合信息。proc sort data=fdata.dd_c;by date;set fdata.dd_c ;if first. date then sum_c=0;sum_c+sum;keep date sum_c ;if last.date then output;例中,对数据集计算1999年活期每日存款总额。这样的方法是不是简单快捷。这个例子很有用,从这里也认识了自动变量:first. date 和last. date的使用方法。数据处理时用这个语句会很省力。例7.26 上例可以用ME
13、ANS过程来实现。proc means data=fdata.dd_c noprint;var sum;output out=sum sum=sum_c;例7.27 从某个SAS数据集中移走一个观测。data fdata.accounts;input acctnum credit;1001 15001002 49001003 3000data fdata.Accounts;modify fdata.Accounts;if acctnum=1002 then remove; /*移走acctnum=1002的观测 */proc print data= fdata.Accounts;title E
14、dited Data Set;例7.28 应用举例。data master;input name $ id $ phonenum;Kevin 1100100 3750066 Sandi 11000001 3756666 Cindy 11000002 6758966 Jim 11000003 6750088 data trans;. 1100100 83750066. 11000001 83756666Vivan 21000001 83750387modify master trans;by id ;if _iorc_=%sysrc (_sok) then replace; /*在master中
15、找到观测进行替代 */else if _iorc_=%sysrc (_dsenmr) then do;error=0; _iorc_=0;proc print data=master;title 含有新电话号码的数据集MASTER例中,用数据集TRANS 中的值更新数据集MASTER中的电话号码,增加一个观测到数据集MASTER的结尾。SYSRC对MASTER每次试图重新得到一个_IORC_的值,自动调用宏检验。例7.29 规定缺失值字符。data period_a;missing X I;input Id $4. Foodpr1 Foodpr2 Foodpr3 Coffeem1 Coffee
16、m2;datalines;1001 115 45 65 I 781002 86 27 55 72 861004 93 52 X 76 881015 73 35 43 112 1081027 101 127 39 76 79 ;例中,MISSING语句规定用字符X和I表示缺失值。如果不用MISSING语句,当读入数值变量的缺失值时(这里为X和I),就要产生错误。例7.30 用INPUT语句读入可疑数据行时使用LIST语句。input x y;if x19 then error type and age dont macth age=;Wu teen 20Li teen 12Cindy adult 2819 then do;put _error_=1;上面两段程序的结果相同。第一段用ERROR语句,第二段用PUT和_ERROR_语句。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1