SAS數(shù)據(jù)步修改與選擇觀測課件_第1頁
SAS數(shù)據(jù)步修改與選擇觀測課件_第2頁
SAS數(shù)據(jù)步修改與選擇觀測課件_第3頁
SAS數(shù)據(jù)步修改與選擇觀測課件_第4頁
SAS數(shù)據(jù)步修改與選擇觀測課件_第5頁
已閱讀5頁,還剩98頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第7章數(shù)據(jù)步修改與選擇觀測章數(shù)據(jù)步修改與選擇觀測清華大學經(jīng)管學院清華大學經(jīng)管學院 朱世武朱世武本章介紹數(shù)據(jù)步中用于修改與選擇觀測的語句。利用修改與選擇觀測語句,可以進行數(shù)值計算、數(shù)據(jù)集修改、觀測子集選擇及輸出控制等。賦值語句賦值語句 語句格式: variable=expression;將表達式結果賦予一個變量。 選項說明: variable規(guī)定變量名或數(shù)組元素expression有效的SAS表達式例7.1 賦值語句舉例 data a;set ResDat.class;by sex;n=_N_; error=_error_; first_s=first.sex; last_s=last.sex

2、; proc print;run;x=a+b; /* 規(guī)定新變量x,它是a和b的和*/t(2)=sum(of x1-x5); /*規(guī)定數(shù)組元素,它的值是一函數(shù)值*/a=a+b; /*規(guī)定一個已經(jīng)存在的變量a,它的值為原來值和b之和*/結果顯示:Obs Name Sex Age Height Weight n error first_s last_s 1 Alice F 13 56.5 84.0 1 0 1 0 2 Barbara F 13 65.3 98.0 2 0 0 0 3 Carol F 14 62.8 102.5 3 0 0 0 4 Jane F 12 59.8 84.5 4 0 0

3、0 5 Janet F 15 62.5 112.5 5 0 0 0 6 Joyce F 11 51.3 50.5 6 0 0 0 7 Judy F 14 64.3 90.0 7 0 0 0 8 Louise F 12 56.3 77.0 8 0 0 0 9 Mary F 15 66.5 112.0 9 0 0 1 10 Alfred M 14 69.0 112.5 10 0 1 0 11 Henry M 14 63.5 102.5 11 0 0 0 結果變量類型結果變量類型 決定結果變量類型的準則: 如果表達式中的變量全為數(shù)值型,結果變量為數(shù)值型; 如果表達式中的變量全為字符型,結果變量為字符

4、型; 如果表達式中的變量既有數(shù)值又有字符型,結果變量為數(shù)值型。結果變量長度結果變量長度 結果變量的長度是第一次掃描結果的長度,除非事先由LENGTH語句規(guī)定好結果變量的長度。 例7.2 第一掃描結果的長度不是所有數(shù)據(jù)中的最大長度時會出錯 data a;lstknm=深發(fā)展; /*第一掃描結果的長度為4 */lstknm =大秦鐵路; /* lstknm的長度為4,所以顯示結果為lstknm =大秦鐵*/proc print;run;Obs lstknm-1 大秦鐵例7.3 用LENGTH語句得到正確輸出結果 data a;length lstknm $12; /* 規(guī)定變量lstknm的長度為

5、12 */lstknm=深發(fā)展; lstknm =大秦鐵路; proc print;run;Obs lstknm-1 大秦鐵路累加語句累加語句 語句格式: Variable+expression;累加語句累加表達式結果。 選項說明: variable規(guī)定累加變量expression有效的SAS表達式應用準則: 累加變量的觀測被讀入之前,值為0; 表達式的計算結果為缺失值時,取0代替; 表達式可以使用比較算符; 語句A+(-B)中的(+)是必須的,不能寫成A-B。 例7.4 累加語句等于使用SUM函數(shù)和一個RETAIN語句data a (keep=name height s_h);set Res

6、Dat.class ;s_h+height;proc print;run;data b (keep=name height s_h);set fdata.class ;s_h=sum(s_h, height, 0); retain s_h 0; run;上面兩段程序等價 Obs Name Height s_h1 Alice 56.5 56.52 Barbara 65.3 121.83 Carol 62.8 184.64 Jane 59.8 244.45 Janet 62.5 306.96 Joyce 51.3 358.27 Judy 64.3 422.58 Louise 56.3 478.89

7、 Mary 66.5 545.3 應用舉例應用舉例 例7.5 表達式SUMX+X*X把X*X的結果加到SUMX上 data a (keep=date uss);set ResDat. Dret(where =(stkcd=000002);uss+ Dret*2; /*USS為變量Dret的平方和 */run;例7.6 計算非缺失值的觀測個數(shù)data a(keep=nmis);set ResDat.indcls;nmis+sector= ;run;例中,NMIS為變量SECTOR非缺失值的觀測個數(shù),即按SECTOR分好類股票的個數(shù)。 DELETE語句語句DELETE語句停止處理當前觀測,該觀測值

8、不被讀入到創(chuàng)建的數(shù)據(jù)集,SAS系統(tǒng)返回到DATA步的開頭處理其他觀測。語句格式:DELETE; 例7.7 刪除部分觀測值 data stka;set ResDat.lstkinfo;if Stktype=B then delete;run;例中,刪除數(shù)據(jù)集RESDAT中Stktype=B的觀測值。例7.8 清空數(shù)據(jù)集 data a;set ResDat.lstkinfo;delete;run;例中,刪除數(shù)據(jù)集A中的所有觀測值,即清空數(shù)據(jù)集A。設計復雜程序時,常會用到DELETE語句的這種用法。LOSTCARD語句語句 LOSTCARD語句用于重新對準輸入數(shù)據(jù)。當一個觀測包含幾個數(shù)據(jù)行,且當前觀

9、測缺少其中的一些行時,利用LOSTCARD語句可以防止SAS系統(tǒng)從下一個觀測的數(shù)據(jù)行讀數(shù)據(jù)作為當前觀測的一部分。語句格式LOSTCARD;使用LOSTCARD語句時,必須用IF-THEN語句給出丟失數(shù)據(jù)行的條件。適合使用LOSTCARD語句的情況有:每個觀測有固定的輸入數(shù)據(jù)行;同一個觀測的每個數(shù)據(jù)行都有一個同值的識別變量。 例7.9 每個數(shù)據(jù)行都有一個同值的識別變量data a;input id 1-3 reject #2 idc 1-3 pass; if id ne idc then do;put 數(shù)據(jù)行錯誤 id= idc=;lostcard;end;cards;301 32301 614

10、32302 53302 83171400 92845411 46411 99551;proc print;title2 每個觀測包含2個數(shù)據(jù)行;run; 每個觀測包含兩個數(shù)據(jù)行 Obs id reject idc pass 1 301 32 301 61432 2 302 53 302 83171 3 411 46 411 99551LOSTCARD語句的執(zhí)行步驟:語句的執(zhí)行步驟: SAS日志上輸出一個丟失記錄卡信息,一條標尺及創(chuàng)建當前觀測所讀的數(shù)據(jù)行; 不輸出觀測到數(shù)據(jù)集,丟棄開始讀入本組的數(shù)據(jù)行,返回到DATA步開頭; 試圖用該組第二個數(shù)據(jù)行開始并按INPUT語句規(guī)定的行數(shù)讀數(shù)據(jù)行來創(chuàng)建觀

11、測; 當丟失記錄行的IF條件仍是真的,SAS重復前三步; 對于IF條件不成立的一組數(shù)據(jù)行,SAS創(chuàng)建一個觀測,并增加自動變量_N_的值。 例7.10 每個觀測包含3個數(shù)據(jù)行 data a;input id1 x $ #2 id2 y $ # 3 id3 z $;if id1 ne id2 or id2 ne id3 then lostcard;cards;101 A102 B102 B103 C103 C103 C104 D105 E105 E105 E;proc print;title 每個觀測包含3個數(shù)據(jù)行;run; 每個觀測包含3個數(shù)據(jù)行 Obs id1 x id2 y id3 z1 1

12、03 C 103 C 103 C2 105 E 105 E 105 E例中,DATA步讀3個數(shù)據(jù)行作為1個觀測。第1個觀測有2個丟失記錄,第2個觀測有1個丟失記錄,第4個觀測丟失2個記錄。只有第3和第5個觀測是完整的觀測。LOG窗口顯示的信息:NOTE: LOST CARD.RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+-05 101 A6 102 B7 102 BNOTE: LOST CARD.8 103 CNOTE: LOST CARD.9 103 CNOTE: LOST CARD.11 104 D12 105 E13 105 ENOTE: 數(shù)據(jù)集

13、 WORK.A 有 2 個觀測和 6 個變量。 STOP語句語句STOP語句停止處理DATA步。當遇到STOP語句時,正被處理的那個觀測沒有添加到SAS數(shù)據(jù)集上。語句格式:STOP; 例7.11 停止處理DATA步data a;set resdat.lstkinfo;if _n_=5 then stop;proc print; /*OUTPUT窗口照常打印數(shù)據(jù)集列表 */run;例中,數(shù)據(jù)集A從數(shù)據(jù)集resdat.lstkinfo中讀取了4條觀測,因為當指針標識_N_=5時,遇到STOP語句,正被處理的那條觀測沒有添加到數(shù)據(jù)集A中。ABORT語句語句 ABORT語句中止執(zhí)行當前的DATA步,繼

14、續(xù)執(zhí)行下一個DATA或PROC步。執(zhí)行ABORT語句時,創(chuàng)建ABORT語句執(zhí)行前已處理觀測的數(shù)據(jù)集。但是,當新創(chuàng)建數(shù)據(jù)集和已存在的SAS數(shù)據(jù)集同名時,不能覆蓋已存在的數(shù)據(jù)集。 語句格式 :ABORT|; RETURN選項說明選項說明 立即使當前的SAS作業(yè)或會話正常結束。產(chǎn)生的結果依賴于執(zhí)行的方式。批處理方式和非交互方式下: 立即停止處理; 在LOG窗口顯示錯誤信息,說明由ABORT語句的RETURN選項終程序執(zhí)行; 不執(zhí)行任何相繼的語句或檢查句法; 用一個條件碼指示有錯誤地控制返回到主機系統(tǒng)。 顯示管理方式和交互行方式下: 立即停止處理并返回到主機系統(tǒng)。 例7.12 顯示管理方式下使用sto

15、p語句與abort的區(qū)別。使用stop語句時,LOG窗口不顯示錯誤信息,當新創(chuàng)建數(shù)據(jù)集和已存在的SAS數(shù)據(jù)集同名時,能覆蓋已存在的數(shù)據(jù)集。data a;set resdat.lstkinfo;if _n_=5 then stop;run;Log窗口顯示:NOTE: 從數(shù)據(jù)集 RESDAT.LSTKINFO 讀取了 5 個觀測。NOTE: 數(shù)據(jù)集 WORK.A 有 4 個觀測和 12 個變量。NOTE: “DATA 語句”所用時間(總處理時間): 實際時間 0.35 秒 CPU 時間 0.01 秒使用abort語句時,LOG窗口顯示錯誤信息,當新創(chuàng)建數(shù)據(jù)集和已存在的SAS數(shù)據(jù)集同名時,不能覆蓋已

16、存在的數(shù)據(jù)集。data a;set resdat.lstkinfo;if _n_=5 then abort;run;Log窗口顯示:ERROR: ABORT 語句在行 51 列 15 終止了執(zhí)行。Stkcd=000007 Lstknm=深達聲A Lstdt=1992-04-13NOTE: SAS 系統(tǒng)由于錯誤而停止了該步的處理。NOTE: 從數(shù)據(jù)集 RESDAT.LSTKINFO 讀取了 5 個觀測。WARNING: 數(shù)據(jù)集 WORK.A 可能不完整。該步停止時,共有 4 個觀測和 12 個變量。WARNING: 數(shù)據(jù)集 WORK.A 由于該步已停止,而沒有被替換。NOTE: “DATA 語句

17、”所用時間(總處理時間): 實際時間 0.01 秒 CPU 時間 0.02 秒例7.13 ABORT語句防止輸入無效數(shù)據(jù)時出錯。data b;input ssn pay ;if _error_ then abort;cards;111 100aaa 200444 300;proc print;run; 輸出結果:Obs ssn pay 1 111 100 WHERE語句的性質語句的性質 WHERE語句讀入數(shù)據(jù)集之前選擇觀測。WHERE語句是在執(zhí)行數(shù)據(jù)集連接(SET),合并(MERGE),更新(UPDATE)或修改(MODIFY)之前進行的操作。使用WHERE語句時,因為SAS系統(tǒng)只從輸入數(shù)據(jù)集

18、中讀入滿足條件的觀測,所以這樣的SAS程序更有效。WHERE語句不是可執(zhí)行語句,它起不到IF-THEN語句的作用。能用WHERE語句的地方一定可以用IF語句來代替,反之則不行。不過,一旦WHERE語句有效,就一定要用它,因為這樣的程序效率高。 語句格式語句格式WHERE where-expression;僅用于WHERE表達式的特殊算符 算符說明Between-And選擇一定數(shù)值范圍內的觀測Is Missing|Is Null選擇變量值為缺失值的所有觀測Contains|?選擇包含在規(guī)定字符串的觀測Like匹配選擇觀測Same-And增加多個從句例7.15 BETWEEN-AND算符和IS M

19、ISSING|IS NULL算符例句。 Where hstocd between 600000 and 600899;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; /*計算缺失值數(shù)目 */Where name is null;LIKE算符的兩個特殊模式: 百分號(%)可以替代任意多個字符; 下劃線(_)正好有一個字符與之匹配。進行比較時,LIKE算符識別大寫和小寫之間的字符。 例7.16 設有名

20、字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%; /*上述列表的所有名字 */Not like D_an%; /* 沒有名子被選上 */SAMEAND算符的形式:算符的形式:WHERE candition-1;其它SAS語句WHERE SAME AND condition -2其它S

21、AS語句WEHERE SAME AND condition-n;SAS系統(tǒng)選擇除滿足上述定義的條件外,還滿足在SAME-AND算符后列出條件的觀測。 例7.17 使用算符SAME-AND來增加較多的從句到程序中已有的WHERE語句后面,而不需要重新打入原來的從句proc gplot data=ResDat.Idx000001;plot clpr*date=1;where year(date)1996;where same and year(date)2000;run;quit;應用舉例應用舉例 例7.18 選擇數(shù)值變量非0和非缺失的觀測值 Where x;Where x and y; Wher

22、e x/y;例7.19 選擇字符變量非缺失的觀測 Where c= ; where c is not missing;字符變量C不能單獨地作為邏輯表達式 例7.20 選擇一定范圍內的觀測 Where x between 1 and 5; where 1=x=5;例7.22 不能用WHERE語句的情況 data a;set ResDat.Idx000001;where _n_100; /*錯誤語句,必須用錯誤語句,必須用if */run;data a;set ResDat.Idx000001;if _n_100;run;例中,不能用例中,不能用WHERE語句控制語句控制SAS的自動變量。的自動變

23、量。OUTPUT語句語句 OUTPUT語句輸出當前的觀測到被創(chuàng)建的數(shù)據(jù)集中。 語句格式語句格式OUTPUT ; 選項說明: OUTPUT語句的作用:由一個輸入數(shù)據(jù)行創(chuàng)建多個觀測;由一個輸入數(shù)據(jù)文件創(chuàng)建多個SAS數(shù)據(jù)集;由幾個輸入數(shù)據(jù)行合并為一個觀測。 沒有選項將當前觀測輸出到DATA語句中命名的所有數(shù)據(jù)集中data-set-name規(guī)定輸出當前觀測的數(shù)據(jù)集應用舉例應用舉例 例7.23 由一個輸入數(shù)據(jù)行創(chuàng)建多個觀測 data A;input ID $ score1- score3;drop score1- score3;score=score1; output;score=score2; out

24、put;score=score3; output;cards;02126 99 96 9402128 89 90 88;proc print;run;例中,每一行記錄生成三個觀測。每個新觀測將包括代號ID和一次測驗值SCORE. Obs ID score1 02126 992 02126 963 02126 944 02128 895 02128 906 02128 88例7.24 一個DATA步創(chuàng)建多個數(shù)據(jù)集 data A B;set ResDat.lstkinfo;if Stktype=A then output Astk;else if Stktype=B then output bst

25、k;run;例中,一個DATA步創(chuàng)建兩個數(shù)據(jù)集。數(shù)據(jù)集Astk包含變量Stktype=A的所有觀測;數(shù)據(jù)集Bstk包含變量Stktype=B的所有觀測。例例7.27.26 6 由幾個記錄組合信息 proc sort data=ResDat.lstkinfo out=lstkinfo;by stktype;data a;set lstkinfo ;by stktype;if first. Stktype then Num=0;Num+1;keep stktype num ;if last.stktype then output;run;例中,計算數(shù)據(jù)集lstkinfo中兩類不同股票的數(shù)目。這樣的

26、方法是不是簡單快捷。這個例子很有用,從這里也認識了自動變量:first. stktype 和last. stktype的使用方法。數(shù)據(jù)處理時用這個語句會很省力。MISSING語句語句 MISSING語句規(guī)定缺失值的符號。讀入含有缺失值的數(shù)據(jù)源時,必須用MISSING語句,否則可能產(chǎn)生讀入錯誤。 語句格式語句格式Missing charcter1charctern; 其中:charcter規(guī)定代表缺失值的字符。 應用舉例應用舉例 例7.29 規(guī)定缺失值字符 data period_a;missing X I;input Id $4. Foodpr1 Foodpr2 Foodpr3 Coffeem

27、1 Coffeem2;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語句規(guī)定用字符X和I表示缺失值。如果不用MISSING語句,當讀入數(shù)值變量的缺失值時(這里為X和I),就要產(chǎn)生錯誤。 Id Foodpr1 Foodpr2 Foodpr3 Coffeem1Coffeem210011154565 I 781002862755 72 8610049352X 76 881015733543 112 108102

28、710112739 76 79其它語句其它語句 本節(jié)介紹語句LIST, CALL, NULL和ERROR. LIST語句語句 LIST語句在SAS日志窗口上列出正被加工處理觀測的輸入數(shù)據(jù)行。 LIST語句被執(zhí)行時,在列出的第一行記錄之前,顯示一條指示列數(shù)的標尺。語句格式 LIST; 例7.30 用INPUT語句讀入可疑數(shù)據(jù)行時使用LIST語句data a;input x y;if x0 then list;cards;2 6 4 2-1 2 -4 6;run; 290 data a;291 input x y;292 if x0 then list;293 cards;RULE: -+-1-+

29、-2-+-3-+-4-+-5-+-6-296 -1 2297 -4 6NOTE: 數(shù)據(jù)集 WORK.A 有 4 個觀測和 2 個變量。NOTE: “DATA 語句”所用時間(總處理時間): 實際時間 0.00 秒 CPU 時間 0.00 秒298 ;299 run;LOG顯示結果CALL語句語句 CALL語句用于調用子程序。語句格式:Call routine (parameter-1);選項說明: Routine規(guī)定要調用的子程序Parameter傳遞給子程序信息的參數(shù)或變量名等例7.32 創(chuàng)建包含DATA信息的宏變量 data a;call symput (text1, march); /*

30、將march賦給宏變量text1 */call symput (beta, 100); /*將100賦給宏變量beta */run;例7.33 發(fā)布操作系統(tǒng)命令 NULL語句語句 空語句是一個分號(;),用于固定位置。SAS系統(tǒng)用一個分號(;)或四個分號(;)來接受空語句。 一個分號(;)表示CARDS(或DATALINES)語句后數(shù)據(jù)行的結束。 四個分號(;)表示CARDS4(或DATALINES4)語句后數(shù)據(jù)行的結束。 雖然空語句沒有執(zhí)行動作,但它是可執(zhí)行語句。 例7.34 空語句表示數(shù)據(jù)行結束data a;input x y z;if x=. Then goto find;list;fi

31、nd : ;drop x;cards;1 2 5. 1 32 5 8. 3 9;proc print;run;在這個DATA步,CARDS語句告訴SAS 系統(tǒng)在這個作業(yè)流中,緊跟著的是數(shù)據(jù)行,當SAS遇到空語句(;)時,就知道數(shù)據(jù)行結束了。上例中的空語句也可以省略,因數(shù)據(jù)行后面第一個語句(PROC PRINT;)中包含一個分號。輸出窗口顯示結果Obs y z1 2 52 1 33 5 84 3 9ERROR語句語句 ERROR語句置自動變量_error_為1,并有選擇地輸出用戶規(guī)定的一段信息到SAS的記錄窗口。語句格式:ERROR ;選項說明: 沒有選項 規(guī)定_ERROR_為1,但沒有在LOG

32、窗口輸出任何信息Message規(guī)定輸出的信息ERROR語句等價于下面一系列語句: 賦值語句置_ERROR_為1; 一個FILE LOG語句; PUT語句規(guī)定一段信息; 新的一個FILE語句重新設置前一個FILE 語句的設置。例7.35 應用舉例 data a;input name $ type $ age ;if type=teen & age 19 then error type and age dont macth age=;cards;Wu teen 20Li teen 12Cindy adult 28;314 data a;315 input name $ type $ age

33、 ;316 if type=teen & age 19 then error type and age dont macth age=;317 cards;type and age dont macthage=20RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-318 Wu teen 20name=Wu type=teen age=20 _ERROR_=1 _N_=1NOTE: 數(shù)據(jù)集 WORK.A 有 3 個觀測和 3 個變量。NOTE: “DATA 語句”所用時間(總處理時間): 實際時間 0.01 秒 CPU 時間 0.01 秒321 ;LOG窗口顯

34、示data a;input name $ type $ age ;if type=teen & age 19 then do;put type and age dont macth age=;_error_=1;end;cards;Wu teen 20Li teen 12Cindy adult 28;run;上面程序與前一頁程序結果相同。第一段用ERROR語句,第二段用PUT和_ERROR_語句。另外,可以通過FILE語句改變輸出錯誤信息的地點。 第第8章章 數(shù)據(jù)步循環(huán)與轉移控制數(shù)據(jù)步循環(huán)與轉移控制清華大學經(jīng)管學院清華大學經(jīng)管學院 朱世武朱世武ZResdat樣本數(shù)據(jù):樣本數(shù)據(jù):SAS論

35、壇:論壇: DO語句語句 DO語句必須由一個END語句來結束。 DO和END語句之間的這些語句稱為一個DO組。 DO組可以嵌套任意次。 DO語句有5類: 簡單DO語句; 循環(huán)DO語句; DO OVER語句; DO WHILE語句; DO UNTIL語句。簡單簡單DO語句語句 語句格式DO; 一些SAS語句END;應用舉例應用舉例 例8.1 IF/THEN語句用中DO.data a;set ResDat.class;if age14 then do;h_cm=30.5*height/12;put name= sex= age= h_cm=;end;run;329 data a;330 set f

36、data.class;331 if age14 then do;332 h_cm=30.5*height/12;333 put name= sex= age= h_cm=;334 end;335 run;Name=Janet Sex=F Age=15 h_cm=158.85416667Name=Mary Sex=F Age=15 h_cm=169.02083333Name=Philip Sex=M Age=16 h_cm=183Name=Ronald Sex=M Age=15 h_cm=170.29166667Name=William Sex=M Age=15 h_cm=169.0208333

37、3NOTE: 從數(shù)據(jù)集 FDATA.CLASS 讀取了 19 個觀測。NOTE: 數(shù)據(jù)集 WORK.A 有 19 個觀測和 6 個變量。NOTE: “DATA 語句”所用時間(總處理時間): 實際時間 0.01 秒 CPU 時間 0.01 秒上例與下面的if語句效果一樣,但是IF語句效率較低。If age14 then H_cm=30.5*height/12;If age14 then Put name= sex= age= h_cm=; 循環(huán)循環(huán)DO語句語句 DO組中的語句需要被重復執(zhí)行時要用到循環(huán)DO語句。循環(huán)DO語句根據(jù)下標變量重復執(zhí)行DO和END語句之間的語句 語句格式DO index

38、_variable=specification-1;一些SAS語句END;其中:index-variable選項定義下標變量,用于控制DO組的執(zhí)行方式和重復次數(shù)。下標變量包含在創(chuàng)建的數(shù)據(jù)集中,可以用DROP語句刪除。 SPECIFICATION選項格式選項格式 Start ; Specification選項說明: Start規(guī)定下標變量的起始值To Stop規(guī)定下標變量的終止值Increment規(guī)定步長While Expression表達式在每次循環(huán)執(zhí)行前計算Until Expression表達式在每次循環(huán)執(zhí)行以后計算例8.2 缺省的步長為1。do I=1 to 1000;do I=1 to

39、y+3;do I=1 to exit;例8.3 起始值例句。do i=5;do i=1 to n ;do i=n to 1 by 1;do i=k+1 to n-1;do i=1 to k-1, k+1 to n;do i=2, 3, 5, 7, 11, 13, 17;do i=0.1 to 0.9 by 0.1, 1 to 10 by 1, 20 to 100 by 10;do i=saturday, sunday;do i=01jan99d, 25feb99d;do i=01jan99d to 01jan2000d by 1;例句子中,起始值必須全部是數(shù)值或全部是字符常數(shù),也可以是變量。字

40、符常數(shù)必須用引號括起來。 例8.4 使用表達式選項。do i=1 to 10 while(xy);do i=10 to 0 by 1 while(month=jan);應用舉例應用舉例 例8.5 用GO TO語句跳出循環(huán)體。data a;input x y; if xy then goto skip; /*skip是循環(huán)體外的語句標號*/y=log(y-x);yy=y-20;skip: if yy then goto skip; /*skip是循環(huán)體外的語句標號*/339 y=log(y-x);340 yy=y-20;341 skip: if y=5時停止。data a;n=0;do unti

41、l(n=5);put n=;n+1;end;run; END語句語句 END語句是組成DO組或SELECT組的最后一個語句。 語句格式語句格式END; 應用舉例應用舉例 DO;若干個SAS語句END; SELECT (expression); When (expression) SAS語句; Otherwise SAS語句; END; SELECT語句語句 SELECT語句選擇執(zhí)行SAS語句。 語句格式SELECT; WHEN (when-expression-1) statement; WHEN(when-expression-1) statement; END; 選項說明: select-

42、expression選擇表達式when-expression規(guī)定任意有效的一個SAS表達式。Statement任意可執(zhí)行的SAS語句應用舉例應用舉例 例8.13 有SELECT表達式的SELECT語句。data a;set ResDat.st_list;obs=_n_;x=uniform(0);select (obs);when (1) x=x*10;when (2,4,6);when (3,5,7,13,15,17) x=x*100;otherwise x=1;end;run;例中,根據(jù)OBS來計算新變量X的值。當OBS為1時,執(zhí)行x=x*10。當OBS為2,4,6時,X值不變。當OBS為3

43、,5,7,13,15,17時,執(zhí)行X=X*100。OBS為其它值時,執(zhí)行x=1。 例8.14 沒有SELECT表達式的SELECT語句。data _null_;do mon=jan,feb,mar,apr,may,jun,jul,aug,sep;select; when (mon in (jun,jul,aug) put summer mon=;when (mon in (mar,apr,may) put spring mon=;otherwise put fall or winter mon=;end;end;run; 361 data _null_;362 do mon=jan,feb,m

44、ar,apr,may,jun,jul,aug,sep;363 select;364 when (mon in (jun,jul,aug) put summer mon=;365 when (mon in (mar,apr,may) put spring mon=;366 otherwise put fall or winter mon=;367 end;368 end;369 run;fall or wintermon=janfall or wintermon=febspring mon=marspring mon=aprspring mon=maysummer mon=junsummer m

45、on=julsummer mon=augfall or wintermon=sepNOTE: “DATA 語句”所用時間(總處理時間): 實際時間 0.03 秒 CPU 時間 0.01 秒例8.15 SELECT組的正確及錯誤用法舉例。select(x);when (x=2) put two; /*錯誤用法*/end;select(x);when(2) put two; /*正確用法*/end;select;when (x=2) put two; /*正確用法*/end;run;例中,后兩個程序的效果相同。 IF語句語句IF語句的兩種類型:條件IF語句,含有一個THEN子句或ELSE子句;子集

46、IF語句,沒有子句。IF-THEN與與IF-THEN/ELSE語句語句表達式為真時執(zhí)行THEN后面的語句, 表達式為假執(zhí)行ELSE后面的語句。 語句格式:IF expression THEN expression;例8.16 應用舉例。data;if x then delete;if status=OK and type=3 then count+1;if age ne agecheck then delete;if x=0 thenif y ne 0 then put x zero, y nozero;else put x zero, y zero;else put x nozero;if

47、ans=9 thendo; ans=. ;put invalid answer for id=;end;else do; /*當IF條件不成立時,執(zhí)行下面另一DO組 */ans=ans1;valid+1;end;子集子集IF語句語句 語句格式:IF expression;其中:expression是任意有效的表達式。如果表達式真的,SAS語句對正被創(chuàng)建的觀測繼續(xù)執(zhí)行DATA步的語句。如果表達式是假的,SAS立即返回到DATA步的開始對其他觀測執(zhí)行。 例8.17 應用舉例。data a;set ResDat.Idx000001;if _n_100;run;例中,選擇前99條觀測值。GO TO語句

48、與語句標號語句與語句標號 GO TO語句使SAS跳到本程序步帶有標號的語句繼續(xù)往下執(zhí)行。GO TO語句和指定的目標語句必須在同一DATA步。 GO TO語句語句語句格式:GO TO label; GOTO label;Label選項規(guī)定語句標號來指示GO TO的目標。 例8.18 應用舉例。data a;input x ;if 1=x=5 then goto ok;put x; count+1; ok: sumx+x;cards;1 2 7 2 12 24 22;例中,COUNT僅對大于5的數(shù)計數(shù),SUMX+X對每個觀測都執(zhí)行。 xcountsumx1101220337110421125122

49、24624348722470data a;input x ;if 1=x=5 then goto ok;put x; count+1;return;ok: sumx+x;cards;1 2 7 2 12 24 22;run;例中,COUNT僅對大于5的數(shù)計數(shù),SUMX+X僅對X在1和5之間的那些觀測執(zhí)行。 xcountsumx1101220337134215512256243572245例8.19 上面兩例中用DO-END語句替代GOTO語句。data a;input x ;if x5 then do;put x; count+1;end;sum+x;cards;1 2 7 2 12 24 2

50、2;data a;input x ;if x5 then do;put x; count+1;end;else sumx+x;cards;1 2 7 2 12 24 22;語句標號語句標號 語句標號給出GO TO,LINK, FILE語句中的選項HEADER=,或在INFILE語句中選項EOF=的位置。 語句格式:LABEL: statement; LINK語句語句 LINK語句告訴SAS系統(tǒng)立即轉到由LINK語句指示的語句標號,并從那里繼續(xù)執(zhí)行直到一個RETURN語句。RETURN語句讓SAS立即返回到LINK語句后面的那個語句并從那里繼續(xù)執(zhí)行。LINK語句和語句標號所在的目標語句必須在同一

51、個DATA步。 語句格式語句格式LINK label; 例8.20 執(zhí)行一組語句。 data bydro;input type $ wd station $;label type=station type wd=depth to water;elev=.;if type=aluy then link calcu;year=1985;return;calcu: if station=site_1 then elev=6650-wd; if station=site_2 then elev=5500-wd;return; /*返回到link語句下面的year=1985;語句*/cards;aluv 523 site_1uppa 234 site_2aluy 666 site_2;typewdstationelevyear1aluv523site_1.19852uppa234site_2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論