- 洞察大數據價值:SAS編程與數據挖掘
- 楊池然 劉璐
- 13262字
- 2020-06-04 15:26:46
3.1 函數概述
SAS函數是SAS內部已經編譯好的函數,恰當地運用這些函數可以節省程序運行時間、滿足實際功能需求。本章主要結合實例講解怎么運用這些函數和函數實際的功能。SAS函數可以分為數據步中的函數、外部文件函數、庫和類函數還有其他一些特殊函數。實際開發中每一個函數的應用往往都不是獨立的,有時需要幾個函數的聯合應用才能完成一個任務需求。這章函數都是在數據步的應用,建議初學者可以在學習完第4章后學習第3章函數在數據步的實際應用。
3.1.1 函數定義
單從概念上講,函數是一種關系,這種關系使一個集合里的每一個元素對應到另一個(可能相同的)集合里的唯一元素。
函數把實現的功能封裝在子過程中,就相當于用戶看到的電視畫面,其實顯示畫面的功能都在電視里面,用戶看不到,也不需要知道,只需用遙控器來控制電視即可,這個遙控器就相當于函數名。
SAS具有很多已經編譯好的函數,同時用戶可以通過FCMP(函數編譯過程,這個后面章節會講解)過程自定義函數。所謂的自定義函數就是用戶根據需要自己寫程序,實現解決實際問題的某種功能,下面一節將單獨講解SAS的自定義函數,以便于掌握自定義函數。
SAS函數眾多,有算術函數,字符函數,截取函數,概率與密度函數,數學函數和日期、時間函數,樣本統計函數和分位數函數等。本節將常用的一些函數通過實例進行講解和分析,其他不常用的函數可以通過查SAS幫助了解其功能。
函數圖解流程如圖3-1所示。

圖3-1 函數圖解流程
通過函數圖解流程可以看到,輸入參數可以根據用戶需求進行設置,傳遞給函數功能封裝模塊,通過函數功能封裝模塊處理傳遞過來的輸入參數,然后給予一個輸出返回值到用戶。
函數語法定義:

【語法解讀】
●函數名:調取函數的關鍵字。
●參數:SAS函數所帶的設置條件,相當于控制電視的按鈕。
3.1.2 函數參數書寫形式
打個比方,計算機中的鍵盤按鍵,每一個就相當于一個參數,合理地應用鍵盤上的按鍵才能滿足需求。函數參數具有書寫形式,就相當于計算機鍵盤上的表示形式,理解書寫形式才能知道如何調用函數,給函數傳遞參數。
1.一般書寫形式
所謂的一般書寫形式就是按實際需求把每一個參數都寫上,書寫形式如下。

為便于理解一般書寫形式,下面舉一個實際經常用到的函數。學生成績統計中,經常需要統計一門課中學生成績的最高分,這個最高分就是求數值的最大值,SAS語言最大值函數為:

【函數解讀】
MAX就是函數名,相當于電視遙控器中的某個按鈕的名字;X,Y,Z就是代表三個學生的成績,稱為參數。
【注意】參數分為形參和實參,SAS程序運行時的機制是把實參值傳遞給形參。
2.簡寫形式
所謂的簡寫形式是對同一個函數實現相同的功能。
假設學生成績統計中,有20位學生,求學生成績中的最高得分。如果單獨列出20個變量,確實很費時,這時就需要利用函數的參數簡寫形式。表示方法如下。

【函數解讀】
●OF:是簡寫形式的參數語法。
●x1-x20:表示20位學生的學生成績,分別為x1,x2,x3,x4,x5,…,x18,x19,x20。
上面的舉例可以看出函數簡寫形式的用處,函數簡寫形式有以下兩種方式。
第一種方式:函數名(OF參數1-參數N)
【函數解讀】參數1與參數N之間用“-”連接。
第二種方式:函數名(OF參數1參數2…參數N)
【函數解讀】多個參數用空格分隔。
3.1.3 字符處理函數
有時需要提取英文語句中的某個字母或中文語句中的某幾個字,約定俗成把處理字符的函數稱為字符處理函數,這類函數只能處理字符,不能處理數值。
為便于理解字符處理函數,下面把經常用到的字符處理函數從語法和使用范圍以及功能角度結合實例來詳細講解。常用字符處理函數見表3-1。
表3-1 常用字符處理函數

為便于理解這些常用函數的應用,下面結合語法和實際應用實例進行詳細講解。
1.SUBSTR函數
語法格式:

【語法解讀】
●VARIABLE:要處理的字符串變量。
●POSITION:指明開始查找字符串的位置,數值型。
●LENGTH:指明字符串的長度,數值型。
此函數的功能是實現字符串的替換和截取功能。
數據步經常用此函數對變量截取與替換,實際開發中對讀取的外部文件需要根據業務需求截取原變量中的一部分,給新變量賦值。
【例3.1】SUBSTR函數實際開發中的截取功能應用,讀取外部數據文件,存儲在“d:\sastest\yxy”目錄中的zfcl1.dat文件中,從身份證號中取出每一個人的出生年份。
程序如下:

【程序解讀】
程序中通過SUBSTR語句定義了新變量age,此變量的值為substr(hm,7,4)函數從身份證號碼第7位截取、取4個字節的值,這是身份證號中年齡的開始位置與長度。
輸出顯示結果如圖3-2所示。

圖3-2 SUBSTR函數實現截取功能輸出顯示窗口
對于SUBSTR函數,它的替換功能是對原變量指定的字符串用右邊賦值內容替換,是對原變量的修改。實際應用中也是用在數據步對讀取的外部數據文件或關系數據庫表等變量進行替換。
【例3.2】SUBSTR函數替換功能應用,對【例3.1】程序進行改造,將身份證號修改為以370開始,其他不變。

【程序解讀】
讀取數據文件,并對身份證號前三位通過“substr(hm,1,3)='370'”語句替換hm變量,1表示從第一位開始,3表示向右取三位,然后用370替換指定的三位字符串。
輸出顯示結果,hm變量前面都替換為370,其他不變,如圖3-3所示。

圖3-3 SUBSTR函數實現替換功能輸出顯示窗口
2.SCAN函數
語法格式:

【語法解讀】
●STRING:為字符型常量、變量或表達式。
●N:如果N是正的,表示從左到右掃描尋找;如果N是負的,表示從右到左掃描尋找。
●DELIMITERS:指明字符串的分隔符。
此函數的功能是實現對特殊字符的查找,并從查找到的特殊字符處分隔字符串。
這個函數對處理特殊分隔符號的數據很有用,以特殊分隔符號為分界點,取出需要的數據。
【例3.3】SCAN函數提取證件號應用,由于證件號碼分為身份證、軍官證和學生證,數據文件存儲證件號這列數據格式為“B證件號#證件類型標識”。
說明:實際應用中經常用scan函數提取證件號,由于證件號長度不統一,所以以分隔符號為提取標志。

【程序解讀】
1)對讀取的數據文件中的變量zjh_type通過函數scan提取出對應證件號和證件類型。語句如下。

2)數據步定義了新變量zjh,用于存儲證件號,通過zjh=scan(zjh_type,1,'B#')把變量zjh_type中的數據從左到右掃描,把以’B#’分隔的證件號取出來賦值給zjh變量。
3)對于證件類型,需要從右邊開始掃描查找,語句如下。

上面語句首先定義了新變量,通過type=scan(zjh_type,-1,'B#')語句調用scan函數,-1表示從右掃描查找,遇到‘B#’分隔的截取出來。
輸出顯示結果如圖3-4所示。

圖3-4 SCAN函數特殊字符取值輸出顯示窗口
3.INDEX函數
語法格式:

【語法解讀】
●VARABLE:指定的字符串。
●FIND_V:指定要查找的字符。
此函數的功能是尋找在一個字符串中第一次出現的某個字符的位置。
實際開發應用中INDEX函數經常和其他函數聯合應用,如SUBSTR函數通過INDEX函數取字符串的開始位置。
【例3.4】INDXE函數與SUBSTR函數聯合應用,對【例3.3】截取證件類型并賦值給新變量type。

【程序解讀】
SUBSTR函數實現截取功能,INDEX函數查找分隔符所在位置,從此位置的下一位開始截取,2表示截取兩位。
輸出顯示結果從讀取的數據文件的對應變量zjh_type中截取證件類型標識,傳遞給變量type,如圖3-5所示。

圖3-5 數據集subin變量信息輸出顯示窗口
4.LENGTH函數
語法格式:

【語法解讀】
●VARBLE:指定的變量。
此函數的功能是返回字符串變量的長度。
實際中如果需要計算變量長度,可以考慮用LENGTH函數。對于需要從變量右邊截取n個字符,可以通過LENGTH函數計算出總長度,然后通過LENGTH(varble)-n+1計算出開始位置,這個計算方法讀者要理解。
【例3.5】對【例3.4】改造,可以通過LENGTH和SUBSTR函數實現截取證件號類型,同一個問題不同的解答方法,都滿足業務需求。

【程序解讀】
對于語句“type=substr(zjh_type,length(zjh_type)-2+1,2);”SUBSTR函數內部通過LENGTH函數計算出變量的總長度,然后通過公式LENGTH(varble)-n+1求出開始位置。
5.COMPRESS函數
語法格式:

【語法解讀】
●S1:要處理的字符串。
●S2:要移走的字符。
此函數的功能是將字符串特殊字符移除。
【例3.6】COMPRESS函數應用,通訊錄數據文件存儲“'d:\sastest\yxy\telephone.dat”,其中電話號碼在數據文件的存儲方式為“區號#電話號碼”,根據實際需求去掉#號。

【程序解讀】
數據步對外部文件處理,語句“telephone=compress(number,'#');”中compress函數把數據文件中number變量對應的數據中的“#”號移除。
輸出窗口顯示輸出信息,如圖3-6所示。對比number變量與telephone變量,可以看出“#”號被移除。

圖3-6 數據集dh輸出顯示信息
6.TRANSLATE函數
語法格式:

【語法解讀】
●SOURCE:要處理的變量。
●TO:新的字符串。
●FROM:要替換的字符串。
此函數的功能是實現字符串的替換。
TRANSLATE函數實際開發中經常用此函數處理缺失值的變量,由于包含缺失值的變量影響數據裝載、統計分析和數據挖掘等功能模塊,所以缺失值往往都用一個常值替換。
【例3.7】TRANSLATE函數應用,數據文件存儲位置為“d:\sastest\yxy\stuwj.dat”,學號id列為缺失值的替換為“00000”,讀取數據文件,創建數據集th。

【程序解讀】
程序中“id2=translate(id_ls,'99999',' ');”語句通過函數TRANSLATE處理變量id中的缺失值,對于為空的學號用“00000”替換。
輸出窗口顯示數據集信息,如圖3-7所示,對比可以看出id變量通過處理后賦值給id2,對于第二條記錄id學號為空,通過TRANSLATE函數替換處理為“00000”。

圖3-7 數據集th輸出顯示信息窗口
7.TRIM函數
語法格式:

【語法解讀】
●CHAR_ARGU:輸入的字符或字符串。
此函數的功能是過濾掉字符或字符串尾部空格。
【例3.8】去除name變量中的尾部空格。

【程序解讀】
數據步中語句“partiadd=trim(name)||location”中引入trim函數過濾name變量的空格,然后通過串連接,賦值給變量partiadd。
輸出窗口顯示輸出結果,如圖3-8所示,對比partiadd列與notrim列可以發現不同之處為沒有TRIM函數過濾的進行串連接后中間有空格。

圖3-8 數據集gl部分信息輸出顯示窗口
8.UPCASE函數
語法格式:

【語法解讀】
●CHAR_STRING:輸入的字符或字符串。
此函數的功能是把字符或字符串中的小寫字母轉換為大寫。
實際應用中UPCASE往往和其他查詢語句一起使用,有些變量根據大寫字符比對,需要UPCASE函數轉換。
【例3.9】UPCASE函數與IF語句聯合應用。根據UPCASE語句將變量quarter中的小寫字母轉換為大寫并賦值給變量quarter1,IF語句判斷變量quarter1是否滿足條件,滿足的輸出quarter2變量對應的值,把一年四季用對應數值表示。

【程序解讀】
通過UPCASE函數把cards語句輸入的quarter變量對應字母轉換為大寫,然后再與IF語句中的字符做比較,匹配上輸出IF語句后面quarter2變量對應的值。
輸出顯示結果如圖3-9所示,觀察quarter、quater1和quarter2,與程序語句條件對比,可以看到根據條件選擇對應值給quarter2。

圖3-9 數據集vegetables輸出顯示窗口
9.LOWCASE函數
語法格式:

【語法解讀】
●CHAR_STRING:輸入的字符或字符串。
此函數的功能是把字符或字符串中的大寫字母轉換為小寫。
可以將LOWCASE函數和UPCASE函數進行對比來理解其不同之處,其實兩者唯一區別是LOWCASE函數把字符或字符串中的字母轉換為小寫,UPCASE函數把字符或字符串中的字母轉換為大寫。
【例3.10】LOWCASE函數實際開發應用,對【例3.9】進行改造,小寫字母轉換應用。

【程序解讀】
數據步CARDS語句中對應quarter的數據值為大寫字符串,通過LOWCASE函數轉換為小寫,與IF語句中的小寫字符串比較。
輸出顯示結果如圖3-10所示,對比quarter、quarter1和quarter2,可以看到正確大小寫的轉換和IF語句的匹配。

圖3-10 數據集vegetablexx輸出顯示窗口
【注意】UPCASE函數與LOWCASE函數對比學習,理解這兩個成對的函數。
10.URLDECODE函數
語法格式:

【語法解讀】
●CHAR_STRING:輸入的包含URL轉意字符或字符串。
此函數的功能是把包含URL的轉意字符隱藏,把ASCII編碼的轉換為EBCDIC字符。如把加號轉換為空格。實際應用中此函數用來轉換編碼和加密程序處理的編碼轉換。
【例3.11】請把字符“+”轉換為空格,把字符“%21”轉換為EBCDIC字符。

【程序解讀】
數據步中三個變量通過URLDECODE函數轉換編碼,讀者可以對比理解編碼轉換,輸出顯示結果,如圖3-11所示。

圖3-11 URLDECODE函數編碼轉換輸出顯示窗口
說明:如大寫字母L的ASCII編碼是4c,函數把%4c轉換為了大寫字母L。
11.TRANWRD函數
語法格式:

【語法解讀】
●SOURCE:要處理的字符串。
●S1:指明要替換的子串。
●S2:替換成的串。
此函數的功能是把S1字符串替換為S2字符串。
實際開發中經常用TRANWRD函數轉換特殊分隔符號的外部文件,因為這類分隔符號標識分隔不唯一,SAS系統無法區分,因此要把此分隔符號轉換為Windows系統唯一分隔標識。
【例3.12】TRANWRD函數應用,讀取“d:\sastest\yxy\tsfg.dat”文件,創建數據集trawrd。
由于tsfg.dat文件以“|@|”特殊分隔符號分隔文件,文件顯示如圖3-12所示。這個特殊分隔符號不轉化為唯一分隔符號,SAS系統無法讀取。

圖3-12 tsfg.dat文件

【程序解讀】
數據步中語句“_infile_=tranwrd(_INFILE_,'|@|','08'x);”通過TRANWRD函數把分隔符號|@|轉化為’08’x分隔的文件。
輸出窗口顯示數據集信息與文件中信息一致,如圖3-13所示。

圖3-13 數據集trawrd信息顯示窗口
為便于理解TRANWRD函數,下面列舉一個字符替換函數,通過這個簡單的數據步數據處理進一步理解此函數。
【例3.13】TRANWRD函數對“beihai”字符串中的“hai”用“jing”替換。

12.RANK函數
語法格式:

【語法解讀】
●CHARACTER:輸入字符或字符串。
此函數的功能是把CHARACTER字符轉換為ASCII編碼,若為字符串,則只轉換字符串的第一個字符。
【例3.14】請把字符“B”轉換為ASCII編碼。

【程序解讀】
RANK函數對數據步中的變量leter對應的數據轉換為ASCII編碼,通過輸出結果,對比可以看出只是把第一個字符轉換為ASCII編碼的值,B對應的ASCII編碼值為66,如圖3-14所示。

圖3-14 RANK函數輸出顯示窗口
13.BYTE函數
語法格式:

【語法解讀】
●N:輸入的整數值,范圍為0~255,它對應字符的ASCII碼或EBCDIC字符。
此函數的功能是根據輸入的數值,轉換為ASCII碼對應的字符。
【注意】BYTE函數和RANK函數相反,對比這兩個函數可以幫助讀者理解其功能。
【例3.15】請把數值66轉換為ASCII編碼。

【程序解讀】
數據步中的“char=byte(leter);”語句把數值對應的ASCII碼數值轉換為字符,輸出顯示結果如圖3-15所示。

圖3-15 數據集byte輸出顯示窗口
14.REPEAT函數
語法格式:

【語法解讀】
●CHARACTER:輸入的字符或字符串。
●TIMES:自然數。
此函數的功能是把CHARACTER字符或字符串重復TIMES次。
【例3.16】REPEAT函數應用,對【例3.7】改造,通過repeat返回5個9,實現對缺失值賦值的應用,函數自動生成重復值。


【程序解讀】
這個程序實現了【例3.7】中同樣的結果,通過REPEAT函數生成5個9對缺失值賦常值。
15.LEFT函數
語法格式:

【語法解讀】
●CHARACTER:輸入字符或字符串。
此函數的功能是把CHARACTER字符或字符串左對齊,使左邊空格去掉。
LEFT函數在實際應用中對字符串連接時經常需要把左邊空格過濾掉。
【例3.17】LEFT函數應用,把字符串“My name is liulu”左對齊。

【程序解讀】
left1變量值為兩個字符串的連接,通過left函數把變量c1左邊空格過濾掉,對比noleft變量值為直接將兩個字符串連接,輸出顯示結果如圖3-16所示,可以看到沒有加LEFT函數的,連接串的輸出有空格分隔。

圖3-16 LEFT函數輸出顯示窗口
16.REVERSE函數
語法格式:

【語法解讀】
●CHARACTER:輸入的字符或字符串。
此函數的功能是把CHARACTER字符或字符串按相反的順序輸出。
REVERSE函數在加密過程中用來解密碼,原相反輸出的內容,通過此函數可以還原為正常順序輸出。
【例3.18】REVERSE函數在SAS登錄ORACLE數據庫中的應用。

【程序解讀】
宏變量path中對登錄數據庫的實例通過reverse進行了正常輸出順序的轉換,原密碼是相反的。
為便于對此函數的理解,下面舉一個簡單的例子。
【例3.19】請把字符串'How are you'按相反順序輸出。

【程序解讀】
對比變量c和sc的輸出,可以看到通過reverse函數對變量的順序轉換使其按相反順序輸出,輸出顯示結果如圖3-17所示。

圖3-17 REVERSE函數輸出顯示窗口
3.1.4 數學運算函數
數學運算是現實中經常遇到的,SAS系統為滿足實際需求,內部編譯好了很多實現數學運算的函數,每一個數學函數實現一定的數學運算功能。由于SAS內部數學函數眾多,限于篇幅,只把常用函數的用法和功能通過實例詳細講解,其他不經常用到的數學函數,讀者在用到時可以查SAS幫助文件。常用數學運算函數見表3-2。
表3-2 常用數學運算函數說明

1.SUM函數
語法格式:

【語法解讀】
●X,Y,Z:輸入的數值參數。
該函數的功能是實現求和運算。
【例3.20】SUM函數應用,對存儲在“d:\sastest\yxy\xscj.dat”文件中的學生成績求和。


【程序解讀】
SUM函數求chinese、SAS和english三門課的總成績,賦值給總成績變量score。輸出顯示結果如圖3-18所示。

圖3-18 數據集sum輸出顯示窗口
2.MAX函數
語法格式:

【語法解讀】
●X,Y,Z:輸入的數值參數。
該函數的功能是求最大值運算。
【例3.21】MAX函數應用,求數據文件“d:\sastest\yxy\thsj.dat”中客戶電話通話三個月中最大通話時長。

【程序解讀】
MAX函數求出month1、month2和month3三個月中最大通話時長。輸出窗口顯示輸出信息,如圖3-19所示。

圖3-19 數據集max輸出顯示窗口
3.MIN函數
語法格式:

【語法解讀】
●X,Y,Z:輸入的數值參數。
此函數的功能是求最小值運算。
【例3.22】MIN函數應用,對【例3.21】進行改造,求三個月中最小通話時長。

【程序解讀】
MIN函數求出month1、month2和month3三個月中最小通話時長。輸出窗口顯示輸出信息,如圖3-20所示。

圖3-20 數據集min輸出顯示窗口
【注意】MAX函數和MIN函數用法相同,只是功能不同,一個求最大值,一個求最小值,讀者可以對相似的函數對比學習。
4.ABS函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求變量X的絕對值。
實際年齡不可能為負值,所以在處理這類數據時通常應用ABS函數過渡,對原數據取絕對值,防止年齡為負值的情況出現。
【例3.23】ABS函數應用,對數據文件sb.dat中的年齡取絕對值。

【程序解讀】
ABS函數對數據步中讀取數據文件中的年齡變量age_tm取絕對值,根據實際意義,年齡是不能為負值的。
對比輸出變量age_tm和變量age兩列的數據,數據文件中age_tm列對應年齡有負值,顯然數據不正確,通過abs函數處理后生成正確的年齡,輸出顯示結果如圖3-21所示。

圖3-21 數據集abs輸出顯示窗口
5.MOD函數
語法格式:

【語法解讀】
●X,Y:輸入的數值參數。
此函數的功能是求X除以Y的余數。
實際應用中可以根據MOD函數的余數判斷一個數是不是偶數,如果余數不為零證明此數為奇數,否則為偶數。
【例3.24】MOD函數應用,根據余數判斷數據的奇偶性。


【程序解讀】
1)語句“y=mod(x,2)”運用函數mod求出x/2的余數。
2)應用IF語句比對,如果y=0,則表示此數據為偶數,賦值給變量type=’偶數’,否則執行“else type=’奇數’”語句。輸出窗口顯示輸出處理后的數據集信息,如圖3-22所示。

圖3-22 數據集mod輸出顯示窗口
6.ROUND函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
●PRECI:取的精度。
該函數的功能是求X按PRECI指定的精度四舍五入。
ROUND函數對于一些需要指定精度處理的數據而言是可以滿足需求的,實際應用中小數點后面的數據有時沒有實際意義,可以省略,也就是四舍五入。
【例3.25】ROUND函數應用,個人存款中,客戶利息小數點保留兩位小數,按0.01精度四舍五入。


【程序解讀】
當月客戶實際賬號額度為本金加當月利息,函數ronnd(rate,0.01)指定按0.01精度取利率,四舍五入。輸出窗口顯示信息如圖3-23所示。

圖3-23 數據集round輸出顯示窗口
7.SQRT函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求X的平方根。
數學專業、數據分析或統計學方向技術人員經常用此函數求平方根。
【例3.26】SQRT函數應用,對輸入數據求平方根。

【程序解讀】
SQRT函數求x的平方根,結果輸出到y變量,y值為sqrt(x)函數的值。輸出顯示結果如圖3-24所示。

圖3-24 數據集sqrt輸出顯示窗口
8.CEIL函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求比X數值大的最小整數,若X本身為整數,函數值為X。
【例3.27】CEIL函數應用,年齡大于等于55歲的領取退休金,人員信息存儲在“d:\sastest\yxy\txj.dat”。

【程序解讀】
CEIL函數對數據文件中的年齡age_tm進行處理,取大于54歲的最小整數,對于數據中把年齡輸入錯誤包含小數的年齡進行轉換。對比age_tm和age兩變量數據,可以看到年齡的變化,年齡為小數的55.7通過CEIL函數處理后age變量對應值為56。輸出顯示窗口信息如圖3-25所示。

圖3-25 數據集tx輸出顯示窗口
9.FLOOR函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求比X數值小的最大整數,若X本身為整數,函數值就為X。
【注意】FLOOR函數和CEIL函數歸為一對,FLOOR函數求比輸入值小的最大整數;CEIL函數求比輸入值大的最小整數。對比其差異性來理解和運用這兩個函數。
【例3.28】FLOOR函數應用,對【例3.27】進行改造,用FLOOR函數實現同樣的結果。
【注意】CEIL函數與FLOOR函數只是對應的age值有差異。

【程序解讀】
FLOOR函數處理age_tm,可以看到age_tm對應的年齡55.7通過FLOOR函數處理后其對應的年齡值變為55,可以和CEIL函數處理age_tm變量輸出的age變量對應值進行對比,找出其差異。輸出顯示結果如圖3-26所示。

圖3-26 數據集tx1輸出顯示窗口
10.INT函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求X的整數部分,把小數部分去掉。
實際開發中根據業務需求,如果數據只需要整數部分,可以考慮用此函數去掉小數部分。
【例3.29】INT函數應用,客戶手機通話時長以分鐘為單位,每分鐘0.15元,數據文件存儲在“d:\sastest\yxy\sjth.dat”。

【程序解讀】
根據實際業務需求,通話時間按分鐘計算費用,不需要通話時間中的秒,因此通過INT函數對time變量處理,只取整數部分(即分鐘),去掉后面的秒。然后通過公式int(time)*0.15計算出客戶本月通話費用,賦值給變量fy_money保存。輸出顯示結果如圖3-27所示。

圖3-27 數據集int輸出顯示窗口
11.LOG函數、LOG2函數和LOG10函數
這三個函數屬于一類對數函數,只是底數不同。此處只講解其中一個的用法即可。
●LOG(X):以e為底的自然對數。
●LOG2(X):以2為底的X的對數。
●LOG10(X):以10為底的X的對數。
對數函數在臨床醫學和金融利率上經常用到,此處以LOG2函數為例講解。
【例3.30】LOG2函數應用,醫學臨床實驗測試藥品的合適度,每滴表示1/2濃度。測試數據見表3-3。
表3-3 藥品合適度測試


【程序解讀】
由于用藥量為2的冪次,所以選擇以2為底的對數處理,以便于通過SAS內部的過程對數據集分析。輸出顯示結果如圖3-28所示。

圖3-28 數據集medi輸出顯示窗口
【注意】LOG函數、LOG2函數和LOG10函數屬于一類對數函數,對比可以查看這三個函數的差異,可以對此程序進行改造來看對應的yl2變量值的變化。
12.EXP函數
語法格式:

【語法解讀】
●X:輸入的數值參數。
該函數的功能是求以常值e為指數的X冪的值。
在實際開發中,以e為指數的冪級可以考慮用此函數轉化數據,通過過程步調用統計分析過程對數據分析。
【例3.31】EXP函數應用,以e為指數的收益率分析。年限越長,冪級越高。

【程序解讀】
投資額收益與年限有關,年限越長,n對應的冪級越高,收入也越多,此處只是演示EXP函數,實際投資有風險。預計收益額yd_money為本金ts_money乘以e的n次冪,然后減去本金。輸出顯示結果如圖3-29所示。

圖3-29 數據集tzsr輸出顯示窗口
13.SIN函數
語法格式:

【語法解讀】
●X:輸入的三角形的度數,數值。
該函數的功能是求X的正弦值。
一般做工程分析和數學研究的經常用到此函數,屬于數學上的三角函數。
【例3.32】SIN函數應用,根據數據求正弦值。

【程序解讀】
根據ds度數求出zxz=sin(ds)得到的正弦值,輸出顯示結果如圖3-30所示。

圖3-30 數據集sy輸出顯示窗口
3.1.5 日期和時間函數
日間和時間是任何開發中都要用到的,為了方便對日期和時間的應用,SAS系統內部編譯好了很多日期和時間處理函數,這些函數主要用來處理實際開發中的日期和時間值。經常用到的日期函數是必須掌握的。常用日期函數見表3-4。
表3-4 常用日期函數

(續)

為便于讀者理解每一個函數的應用,本節將單獨對每一個函數通過簡單的程序進行講解,以幫助讀者理解。
1.YEAR函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期值。
該函數的功能是返回V_DATE的年份。
實際應用經常需要對日期時間值取出對應的年份,通過YEAR函數可以滿足業務需求。
【例3.33】YEAR函數應用,根據對應日期截取日期的年份。

【程序解讀】
year函數對輸入的dt日期求出對應的年份。輸出顯示結果如圖3-31所示。

圖3-31 數據集year輸出顯示窗口
2.MONTH函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期值。
該函數的功能是返回V_DATE的月份。
【例3.34】MONTH函數應用,對【例3.33】進行改造,求輸入日期的對應月份。

【程序解讀】
month函數對輸入的dt日期求出對應的月份。輸出顯示結果如圖3-32所示。

圖3-32 數據集month輸出顯示窗口
3.DAY函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期值。
該函數的功能是返回V_DATE的日期。
【例3.35】DAY函數應用,對例3.33進行改造,求輸入日期對應日。

【程序解讀】
day函數對輸入的dt日期求出對應的日期。輸出顯示結果如圖3-33所示。

圖3-33 數據集day輸出顯示窗口
4.MDY函數
語法格式:

【語法解讀】
●MONTH:輸入的月份自然數值,從1月到12月的整數值。
●DAY:輸入的天數,從1到31的整數值。
●YEAR:輸入的兩位或四位的年份整數值。
該函數的功能是從month、day、year中返回一個SAS日期值。
【例3.36】MDY函數應用,根據month、day和year三個變量,返回對應SAS日期值。


【程序解讀】
mdy函數根據傳遞的month、day和year輸出對應的日期。輸出顯示結果如圖3-34所示。

圖3-34 數據集mdy輸出顯示窗口
5.WEEKDAY函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期。
該函數的功能是輸入日期輸出星期幾,1=Sunday,2=Monday,…,7=Saturday。
【例3.37】WEEKDAY函數應用,對【例3.33】進行改造,求輸入日期對應星期幾。

【程序解讀】
weekday函數根據日期輸出對應星期幾。輸出顯示結果如圖3-35所示。

圖3-35 數據集weekday函數輸出顯示窗口
6.QTR函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期。
該函數的功能是根據輸入日期返回一個數值,1代表第一季度,2代表第二季度,3代表第三季度,4代表第四季度。
在一些銷售領域或按季度結算的業務中經常用到此函數來求出日期對應一年的第幾個季度。
【例3.38】QTR函數應用,根據季度調整銷售價格,數據文件存儲在“d:\dzwj\vegetable.dat”中。

【程序解讀】
rq_dt數值變量通過input函數和put函數轉換為對應日期,然后通過qtr函數求出對應的季度,通過IF語句查詢出季度對應的水果價格。輸出顯示銷售日期和對應的季度,根據季度求出對應的水果價格和應收錢數,如圖3-36所示。

圖3-36 vegetable輸出信息窗口
7.HMS函數
語法格式:

【語法解讀】
●V_HOUR:輸入小時的數值。
●V_MINUTE:輸入分鐘的數值。
●V_SECOND:輸入秒的數值。
該函數的功能是根據輸入時間數值返回一個SAS時間。
在要求按時分秒計算的業務中可以考慮用此函數求出時間值。
【例3.39】HMS函數應用,根據運動員開始時間和結束時間輸入的時分秒,轉化為對應的開始時間和結束時間表示。


【程序解讀】
HMS函數根據CARDS語句輸入的時分秒轉化為SAS對應的時間表示。輸出顯示結果如圖3-37所示。

圖3-37 sfm數據集輸出顯示窗口
8.DHMS函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期數值。
●V_HOUR:輸入小時的數值。
●V_MINUTE:輸入分鐘的數值。
●V_SECOND:輸入秒的數值。
該函數的功能是根據輸入日期時間數值返回一個SAS日期時間。
【注意】DHMS函數與HMS函數屬于同一類函數,這兩個函數可以對比學習其不同之處,DHMS函數只是多了一個日期參數,其他與HMS函數相同,也就是DHMS函數包含日期和時分秒。
【例3.40】DHMS函數應用,對3.39進行改造,加入一個日期變量,輸入日期顯示的開始日期時間和結束日期時間。


【程序解讀】
DHMS函數把日期與時間的變量對應值轉化為SAS日期時間格式。輸出顯示結果如圖3-38所示。

圖3-38 dhms數據集輸出顯示窗口
9.DATEPART函數
語法格式:

【語法解讀】
●V_DATETIME:輸入的日期時間。
該函數的功能是根據輸入日期時間返回一個SAS日期部分。
實際業務中如果只是需要日期部分而不需要時間部分,可以通過此函數截取對應的日期。
【例3.41】DATEPART函數應用,根據客戶存款日期時間和取款日期時間,求出存款日期和取款日期。


【程序解讀】
datepart函數對變量ck_time處理截取出存款日期,對變量qk_time處理截取出取款日期。輸出顯示結果如圖3-39所示。

圖3-39 datepart數據集輸出顯示窗口
10.INTCK函數
語法格式:

【語法解讀】
●DATE_INTERVAL:輸入的日期間隔值,如DAY、WEEK、MONTH、QTR、YEAR.、HOUR等。
●V_STARTDATE:輸入的開始日期。
●V_ENDDATE:輸入的結束日期。
該函數的功能是返回兩個日期按間隔求出的間隔值。INTCK函數經常用于求兩個日期之間間隔的年數、月數。
【例3.42】INTCK函數應用,根據國債購買日期和到期日期計算客戶應獲得的取款額,假定國債到期日為2019-03-31。


【程序解讀】
INTCK函數按day(天)間隔計算出取款日期與購買國債的日期之間的天數。輸出顯示結果如圖3-40所示。

圖3-40 qk_money數據集輸出顯示窗口
11.TODAY函數
語法格式:

該函數的功能是返回當前SAS日期值。
【例3.43】TODAY函數應用,取出當前SAS系統的日期。

輸出顯示結果如圖3-41所示。
12.DATETIME函數
語法格式:

該函數的功能是返回當前SAS日期時間值。
【例3.44】DATETIME函數應用,請取出當前SAS系統的日期時間。


輸出顯示結果如圖3-42所示。

圖3-41 today數據集輸出顯示窗口

圖3-42 datetime數據集輸出顯示窗口
13.JULDATE函數
語法格式:

【語法解讀】
●V_DATE:輸入的日期。
該函數的功能是轉換V_DATE日期為5位或7位的Julian date。如果是5位的,前兩位表示年份,后三位表示一年中當前日期的天數。
【例3.45】JULDATE函數應用,請把日期“21jan2018”和“10feb2019”用Julian date日期表示。

輸出顯示結果如圖3-43所示。

圖3-43 juldate數據集輸出顯示窗口
【注意】jul_date顯示的日期18003中18表示2018年,003表示從1月1號到1月3號的天數。19041同理(Julian DATE中后三位表示所取日期在一年中的天數,數值范圍為1~365,閏年1~366)。
3.1.6 統計函數
統計專業人員經常需要對實際數據做數理統計,SAS系統也實際考慮到了這一點,內部編譯好了很多統計函數來滿足統計學的實際應用。常用統計函數見表3-5。
表3-5 常用統計函數

為便于讀者查看函數計算結果,統計函數應用都調用PRINT過程,打印輸出數據集信息到輸出顯示。
1.MEAN函數
語法格式:

【語法解讀】
●V_NUM1,V_NUM2,…,V_NUMN:輸入的數值。
該函數的功能是根據輸入數值求幾何平均數,即(V_NUM1+V_NUM2+…+V_NUMN)/N。
【例3.46】MEAN函數應用,求出2,4,6,8這組數的幾何平均值。


【程序解讀】
MEAN函數計算公式是先求出總和然后除以參與運算的個數,輸出顯示結果如圖3-44所示。

圖3-44 MEAN函數輸出顯示窗口
【例3.47】MEAN函數與SQL查詢語句聯合應用,對ORACLE數據庫中的信用評分數據表根據學歷、行業年限和行業三項得分求幾何均值。

【程序解讀】
MEAN函數可以應用到SELECT語句中,求幾何均值,輸出顯示結果如圖3-45所示。

圖3-45 MEAN函數求數據庫表中幾何均值輸出顯示窗口
2.PDF函數
語法格式:

【語法解讀】
●V_DIST:確定分布狀態,取值有'BERNOULLI','BETA','BINOMIAL','CAUCHY','CHISQUARE','EXPONENTIAL','F','GAMMA','GEOMETRIC','HYPERGEOMETRIC','LAPLACE','LOGISTIC','LOGNORMAL','NEGBINOMIAL','NORMAL'|'GAUSS','NO RMALMIX','PARETO','POISSON','T','UNIFORM','WALD'|'IGAUSS','WEIBULL'。
●V_PARM1,…,V_PARMN:參數表,根據形狀、位置或范圍設置的參數。
該函數的功能是求分布密度值。
【例3.48】PDF函數應用,求出分布狀態為“LAPLACE”,隨機變量為6,自由度為3,分布密度為1的分布密度值。

輸出顯示結果如圖3-46所示。

圖3-46 PDF函數輸出顯示窗口
3.CDF函數
語法格式:

【語法解讀】
●V_DIST:確定分布狀態,取值有'BERNOULLI','BETA','BINOMIAL','CAUCHY','CHISQUARE','EXPONENTIAL','F','GAMMA','GEOMETRIC','HYPERGEOMETRIC','LAPLACE','LOGISTIC','LOGNORMAL','NEGBINOMIAL','NORMAL'|'GAUSS','NORMALMIX','PARETO','POISSON','T','UNIFORM','WALD'|'IGAUSS','WEIBULL'。
●V_PARM1,…,V_PARMN:參數表,根據形狀、位置或范圍設置的參數。
該函數的功能是求累積分布函數。
【例3.49】CDF函數應用,求出分布狀態為“BINOMA”,隨機變量為1,成功概率為0.3的累積分布值。

輸出顯示結果如圖3-47所示。

圖3-47 CDF函數輸出顯示窗口
4.PROBNORM函數
語法格式:

【語法解讀】
●V_X:輸入的隨機變量數值。
該函數的功能是求標準正態分布的概率。
【例3.50】PROBNORM函數應用,求出標準正態分布觀測值小于或等于1.4的概率值。

輸出顯示結果如圖3-48所示。

圖3-48 PROBNORM函數輸出顯示窗口
5.VAR函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。
該函數的功能是求方差。
【例3.51】VAR函數應用,求出3、4和6的方差。

輸出顯示結果如圖3-49所示。

圖3-49 VAR函數輸出顯示窗口
6.STD函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。
該函數的功能是求標準差。
【例3.52】STD函數應用,求出5、7、9的標準差。

輸出顯示結果如圖3-50所示。

圖3-50 STD函數輸出顯示窗口
7.STDERR函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。
該函數的功能是求均值估計的標準誤差。
【例3.53】STDERR函數應用,求出5、7、9的標準誤差。

輸出顯示結果如圖3-51所示。

圖3-51 STDERR函數輸出顯示窗口
8.CV函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。
該函數的功能是求變異系數。
【例3.54】CV函數應用,求出5、7、9的變異系數。

輸出顯示結果如圖3-52所示。

圖3-52 cv函數輸出顯示窗口
9.SKEWNESS函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。
該函數的功能是求偏斜度。
【例3.55】請求出5、7、9的偏斜度。

輸出顯示結果如圖3-53所示。

圖3-53 SKEWNESS函數輸出顯示窗口
10.KURTOSIS函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。參數至少4個值。
該函數的功能是求峰度值。
【例3.56】KURTOSIS請求出5、7、9和11的峰度值。

輸出顯示結果如圖3-54所示。

圖3-54 KURTOSIS函數輸出顯示窗口
11.USS函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。至少一個非缺失值。
該函數的功能是求未校正的平方和。
【例3.57】USS函數應用,求出5、7、9、11未校正的平方和。

輸出顯示結果,如圖3-55所示。

圖3-55 USS函數輸出顯示窗口
12.CSS函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。至少一個非缺失值。
該函數的功能是求修正的離差平方和。
【例3.58】CSS函數應用,求出5、7、9、11修正的離差平方和。

輸出顯示結果如圖3-56所示。

圖3-56 CSS函數輸出顯示窗口
13.RANGE函數
語法格式:

【語法解讀】
●X1,X2,...,XN:輸入的數值。至少一個非缺失值。
該函數的功能是求最大值和最小值之間的極差。
【例3.59】RANGE函數應用,求出-5、7、9、11一組數據中最大值和最小值之間的極差。

輸出顯示結果如圖3-57所示。

圖3-57 RANGE函數輸出顯示窗口
3.1.7 SAS自定義函數
SAS發展到現在已經實現了從只能調用SAS內部已經編譯好的函數到用戶可以自定義函數的質的飛躍。SAS支持用C、C++或SAS語言編寫SAS函數。但用C或C++語言編寫的外部函數必須使用SAS過程PROTO注冊后,才可以在SAS程序中使用。SAS語言編寫的函數要通過FCMP(Function Compiler Procedure)過程注冊,才能支持在其他SAS過程中使用SAS函數。PROC FCMP過程所處理的函數和子例程中可以使用SAS程序設計語言的很多模塊。通過新增的PROTO過程支持以批處理模式注冊使用C或C++程序設計語言編寫的外部函數。
FCMP過程的語法格式:

【語法解讀】
●FCMP:過程名。
●OUTLIB:過程參數。
●LIBNAME.DATASET_NAME.PACKAGE_NAME:依次表示邏輯名、數據集名、數據包名。
●INLIB=SUB_LIBRA ENCRYPT:如果在其他FCMP過程的數據包中用過此例程的名字,就需要此語句聲明,防止數據包重名;ENCRYPT表示加密。
【例3.60】根據信用卡級別調整信用卡額度。通過調用自定義函數調整信用卡額度。


【程序解讀】
通過FCMP過程創建了一個自定義函數adjust_amount,此函數編譯通過后可以直接在數據步引用,把實參傳遞給形參。
執行打印程序,查看數據集信息,打印程序如下。

輸出顯示結果如圖3-58所示。

圖3-58 信用卡額度調整后輸出顯示窗口
自定義函數存儲位置是在邏輯庫zdy所對應的數據集illusion里面的modify_amount包中,如圖3-59所示。

圖3-59 SAS自定義函數存儲信息窗口
- PostgreSQL 11 Server Side Programming Quick Start Guide
- Cinema 4D R13 Cookbook
- 基于LabWindows/CVI的虛擬儀器設計與應用
- 走入IBM小型機世界
- Practical Data Wrangling
- 西門子S7-200 SMART PLC從入門到精通
- 智能工業報警系統
- Mastering Game Development with Unreal Engine 4(Second Edition)
- 零起點學西門子S7-200 PLC
- Building a BeagleBone Black Super Cluster
- Linux內核精析
- 基于ARM9的小型機器人制作
- 從零開始學JavaScript
- 寒江獨釣:Windows內核安全編程
- Web璀璨:Silverlight應用技術完全指南