【正文】
另外,程序中的第二個 Return 語句,也就是子程序的返回語句在本程序中是可以省略的,因為這個 Return 語句的再下面正好就是 DATA步的結(jié)束處,它也有一個隱含的Return 語句可供子程序返回。然后子程序根據(jù) Test 變量的值進行分析判斷運算,結(jié)果都存放在 Grade 變量中再返回。 每次調(diào)用從標(biāo)號語句 recode: select 開始到 Return 語句結(jié)束的子程序前,要先給 Test 變量賦所要轉(zhuǎn)換的分?jǐn)?shù)值。 Run 。 Return 。D39。C39。B39。A39。 recode: select 。 grade3=grade 。 test=test3 。 link recode 。 grade1=grade 。 81edb6ff5799cbd72b415b6e1b9a8a6b SAS 系統(tǒng)和數(shù)據(jù)分析 電子 商務(wù)系列 上海財經(jīng)大學(xué)經(jīng)濟信息管理系 IS/SHUFE Created by Page 20 of 20 test=test1 。 39。 Set 。 程序如下: Libname Study “d:\sasdata\mydir” 。 因為學(xué)生成績數(shù)據(jù)集 CLASS 中的成績數(shù)據(jù)很多,對每一個百分?jǐn)?shù)成績數(shù)據(jù)都要轉(zhuǎn)換為等級分,處理方法都相同,所以我們用調(diào)用一個將百分?jǐn)?shù)轉(zhuǎn)換為等級分子程序的方法來實現(xiàn)。有 LINK 語句而沒有 RETURN 語句的數(shù)據(jù)步,并不 會發(fā)生錯誤,而是執(zhí)行到最后 DATA 結(jié)束處,用隱含的 RETURN 語句返回到LINK 后的那條語句。事實上,每一個 DATA步的結(jié)束處都包含一個隱含的 RETURN。 如果 GOTO 語句后也有 RETURN 語句, LINK 語句和 GOTO 語句之間的差別在于這個RETURN 語句的作用。它們都是可以嵌套的,且都用同一 RETURN語句返回,返回到調(diào)用語句的下一條語句。 LINK— RETURN結(jié)構(gòu)從程序執(zhí)行的本質(zhì)看,是調(diào)用子程序和子程序返回。 RETURN 。 語句標(biāo)號 : ?? 。 ?? 。 LINK 語句標(biāo)號 。 LINK 語句的 基本使用格式如下: Data 數(shù)據(jù)集 。執(zhí)行 RETURN 語句立即返回到 LINK 語句后面的那個語句并從那里繼續(xù)執(zhí)行。最后的結(jié)果是, OBS=6時: COUNTIF=3,ACCTEST=270。 程序中的 ok: acctest=acctest+test 累加語句,如果條件不成立,執(zhí)行完 countif=countif+1計數(shù)語句后,也要執(zhí)行此累加語句。 Run 。 cards。 countif=countif+1。 retain countif 0 acctest 0 。 Data 。為了使大家明白整個過程,我們創(chuàng)建一個記錄過程的數(shù)據(jù)集 CLASS03,且顯示出來。 GOTO語句最常見的使用,是出現(xiàn)在 IF— THEN 語句中,作為 THEN分句。當(dāng)然 GOTO 語句的功能是可以通過其他結(jié)構(gòu)化控制轉(zhuǎn)移語句替代實現(xiàn)。 Run 。 語句標(biāo)號 :?? 。 GOTO 語句標(biāo)號 。 GOTO 語句的基本使用格式如下: Data 數(shù)據(jù)集 。 GOTO語句的實現(xiàn),是通過 GOTO語句中和目標(biāo)語句前使用相同的語句標(biāo)號才識別目標(biāo)和實現(xiàn)轉(zhuǎn)移的。 Run 。 Set 。 程序如下: Libname Study “d:\sasdata\mydir” 。 2. 使用 IF 語句 當(dāng)我們在創(chuàng)建 SAS 數(shù)據(jù)集時使用 IF 語句的格式之二,常用來創(chuàng)建滿足 IF 條件表達(dá)式的新數(shù)據(jù)集。二是如果 THEN 和 ELSE后的 SAS 語句不直接寫在同行的后面,而是寫在下一行, THEN 和 ELSE 后不能加分號“;”,表示本程序行并沒有結(jié)束,直到遇到分號“;”為止。 Run 。 else fatness=n。 else fatness=n。 Set 。 程序如下: Libname Study “d:\sasdata\mydir” 。假設(shè), 人的標(biāo)準(zhǔn)體重計算公式 .:男性之標(biāo)準(zhǔn)體重(千克)=身長(厘米)-100,女性之標(biāo)準(zhǔn)體重(千克)=身長(厘米)-102。另外, THEN 和 ELSE 后還可以跟 DO 語句, 格式見 DO 語句的程序格式之一。如果條件表達(dá)式為假,執(zhí)行 ELSE后面的語句,沒有 ELSE 語句執(zhí)行 IF 語句的下一條語句。 ? IF語句的格式之二: IF 條件表達(dá)式 。 圖 用 SELECT— WHEN 組產(chǎn)生的數(shù)據(jù)集結(jié)果 81edb6ff5799cbd72b415b6e1b9a8a6b SAS 系統(tǒng)和數(shù)據(jù)分析 電子 商務(wù)系列 上海財經(jīng)大學(xué)經(jīng)濟信息管理系 IS/SHUFE Created by Page 16 of 20 三、 實現(xiàn)分支( IF 語句) 在 SAS 語言中, IF 語句有兩種使用格式: ? IF語句的格式之一: IF 條件表達(dá)式 THEN SAS 語句 。 Run 。 End 。 When(aver=70) grade=”C” 。 When(aver=90) grade=”A” 。 aver = (test1+test2+test3)/3 。 Data Class02 。 例如,我們有一個 CLASS 數(shù)據(jù)集,存放的是學(xué)生的 成績表,我們要創(chuàng)建一個新的數(shù)據(jù)集CLASS02,新增平均成績 AVER 變量和等級考評 GRADE 變量, GRADE 的值是根據(jù) AVER值的大小給出 A、 B、 C、 D 四個等級。即使后面 WHEN語句也滿足條件,也不再執(zhí)行了。 如果沒有 SELECT 的表達(dá)式, when 表達(dá)式中一定要含有比較操作符,先求出第一個 when表達(dá)式的真假結(jié)果,如果為真,執(zhí)行這個 WHEN 后面的 SAS 語句,如果為假,執(zhí)行下一條WHEN 語句或 OTHERWISE 語句。 SELECT 語句的一般格式如下: Select (select 表達(dá)式 ) 。如果所有的 WHEN 條件均不成立,那么執(zhí)行 OTHERWISE 語句給出的 SAS 語句。 SELECT 語句開始一個 SELECT 組, SELECT 組包括一些 WHEN語句,當(dāng)一個設(shè)定的條件為真時,執(zhí)行對應(yīng)的 WHEN 語句給出的一些 SAS 語句。本質(zhì)上是一種多路分支結(jié)構(gòu),當(dāng)然可以用 IF— THEN 結(jié)構(gòu)的多層嵌套來實現(xiàn),但當(dāng)分支較多時, SELECT 語句會很方便,結(jié)構(gòu)也很清楚。 Run 。 Card 。 Input date date7. close 。 當(dāng)然,以上的程序只是為了說明循環(huán) DO 組和 RETAIN 語句的使用,在實際應(yīng)用中,求移動平均線最簡單的方法是采用求滯后值 LAGn 函數(shù)。但它有一個致命的缺點,數(shù)組 a{i}的大小與記錄的條數(shù)相關(guān),當(dāng)實際數(shù)據(jù)的記錄數(shù)很大時,將占用很大的存儲空間,甚至發(fā)生內(nèi)存溢出錯誤而不能運行。 Run 。 Card 。 moveaver=t/day 。 t= t+a{i} 。 t=0 。 Retain 。 Array a{5} 。 Retain day 3 。程序運行結(jié)果如圖 所示。 DO- END 循環(huán)的作用是用 T 累加器求最近三日收盤價之和, T 變量每次求和前要初始化為 0。第一條 RETAIN語句的目的是設(shè)置常量 day=3,下標(biāo)變量 i的初值為 1,第二條 RETAIN 語句的主要目的是為了保留存放收盤價數(shù)據(jù)的數(shù)組 a{i},我們?yōu)榱耸勾蠹颐靼赘鱾€變量的變化過程, RETAIN 語句后未專門指定數(shù)組 a{i},而是保留用 INPUT語句或賦值語句創(chuàng)建的所有變量。移動平均價的計算要考慮初始情況,對于 3 日移動平均價來講,第一條和第二條觀測的 3 日移動平均價的數(shù)值是不存在的,從第三條觀測開始有計算數(shù)據(jù)。 Run 。 Card 。 End 。 moveaver=t/day 。 a{i}= a{i +1} 。 Do i = 1 to day 。 If _n_= day Then do 。 a{ i }= close 。 Input d