Functions & Call Routines
接收參數、回傳值
SAS內建元件之一,提高資料處理的效率
Contents
函數 – Functions
在其他程式語言同樣也有函數的存在,SAS函數與它們類似,都是藉由丟入幾個參數值,而得到想要的回傳值。
SAS有許多內建的函數,當然也可以建立自己的函數PROC FCMP,未來再單獨寫一篇介紹用法。
基本形式
Functions ( Argument1, Argument2, …)
- Functions填入想要使用的函數名稱
- 後面的參數(Argument)則是會根據不同函數,而需要填入不同數量
使用
函數使用地方十分廣泛,例如賦值敘述句、Where敘述句裡的運算式、Proc SQL等。
賦值敘述句(Assignment Statement)
Data test;
Sum_Number=sum(1234, 5678);
run;
我們關注第二行的語法,此為賦值敘述句
- 等號左側:我們想要建立的變數名稱,想要將等號右側右邊的值賦予到「Sum_Number」這個名稱的變數
- 等號右側:在這邊使用了Sum這個函數,它能將括號內的值加總後回傳給我們
Where敘述句(Where Statement)
Data New_Cars;
set sashelp.cars;
where Sum(MSRP, Invoice) <= 30000;
run;
我們關注第三行的語法,此為Where敘述句
- Where敘述句是用到限制讀取資料集的條件,可以將資料量減少、專注在我們想要的資料上
- 由Where關鍵字與後方的運算式(Expression)所組成
- 同樣使用Sum這個函數,這次的目的是想要讀取sashelp.cars這個資料中,MSRP與Invoice這兩個函數加總值小於等於30000的所有值
- 最後我們打開New_Cars這個資料集就會看到只出現符合Where敘述句條件的資料
Proc SQL
Proc SQL;
select Make, Length(Make) as Length_Make
from sashelp.cars;
quit;
因為還沒有介紹Proc SQL,這邊我們只關注第二行「Length(Make) as Length_Make」的語法
- 我們使用了Length這個函數,它的功能是用來計算括號內變數的長度後傳回一個數值
- 例如:Make為Acura時,會回傳5;Make為Audi時,會回傳4
- 注意:每筆資料的Make變數中,所以最後得到的值並不一定會相同
Call Routines
Call Routines與函數非常類似,都是藉由丟入幾個參數值,而得到想要的回傳值。
但最大的差別在於:不能在賦值敘述句跟Where敘述句中使用!
基本形式
Call Rontines ( Argument1, Argument2, …)
- Call是必要的關鍵字,不可省略與更改
- Rontines填入想要使用的Call Rontines名稱
- 後面的參數(Argument)則是會根據不同函數,而需要填入不同數量
- 這邊的參數與函數差別在於:通常有一個參數是用來接收回傳值(因Call Rontines而異),如前面所說的「Call Rontines不能在賦值敘述句中使用」,這是為什麼呢?因為它本身就是一個敘述句
使用
一般用法
Data test;
length String $50;
Call CATS(String, " ++ ", " O ", " A ", " O ", " ++ ");
run;
我們關注第三行的語法
- Call是必要的關鍵字,不可省略與更改
- Call CATS的基本形式是「Call CATS(Return, Argu1, Argu2, …)」
- Call CATS功能是用在將每個參數內的值先刪除前導與尾隨空白後,再進行串聯
- 括號內的第一個參數Return是用來儲存後面參數串聯後的值,在本例中則是將後面的5個參數去掉空白後串聯,最後儲存到String這個變數中
常用
SAS內建的函數跟Call Routines數量十分龐大,這邊介紹個人在進行資料處理時較常使用的種類
數值處理
SUM | sum(Argu1, Argu2, …) | 加總所有參數 |
INT | int(Argu) | 取整數 |
ROUND | round(Argu <, Rounding-unit>) | 四捨五入 |
FLOOR | floor(Argu) | 傳回小於參數的最大整數值 |
CEIL | ceil(Argu) | 傳回大於參數的最大整數值 |
文字處理
UPCASE | upcase(Argu) | 傳回參數的大寫值 |
LOWCASE | lowcase(Argu) | 傳回參數的小寫值 |
SUBSTR | substr(string, position <, length>) | 從第P位擷取L個字元 |
COMPRESS | compress(source ,< characters> ,< modifier(s)>) | 刪除特定字元後回傳 |
TRANWRD | tranwrd(source, target, replacement) | 以特定字元替換目標字元後回傳 |
CATX | catx(delimiter, Argu-1 <, … Argu-n>) | 刪除前導與尾隨空白後插入指定分隔符號回傳 |
CALL CATX | call catx(delimiter, Result, Argu-1 <, … Argu-n>) | 刪除前導與尾隨空白後插入指定分隔符號回傳到指定變數 |
CATS | cats(Argu-1 <, … Argu-n>) | 刪除前導與尾隨空白後回傳 |
CALL CATS | call cats( result <, Argu-1, …, Argu-n>) | 刪除前導與尾隨空白後回傳到指定變數 |
搜尋
INDEX | index(source, excerpt) | 傳回source中符合excerpt字串的第一個位置 |
FIND | find(string, substring <, modifier(s)> <, start-position>) | 從指定的位置開始搜尋,傳回string中符合substring字串的第一個位置 |
SCAN | scan(string, count <, character-list <, modifier>>) | 傳回string中,依照character-list計數的第count個字元 |
時間日期
TIME | time() | 無需參數,傳回目前的時間 |
TODAY | today() | 無需參數,傳回目前的日期 |
DATEPART | datepart(datetime) | 擷取日期時間的值後,回傳日期值 |
DAY | day(date) | 回傳日期值的當月第N天 |
MONTH | month(date) | 回傳日期值的當年第N個月 |
YEAR | year(date) | 回傳日期值的N年(西元制) |
MDY | mdy(month, day, year) | 放入月、日、年的值後,回傳完整的日期值 |
其實還有眾多沒有談到的種類,之後會盡量以主題的方式來介紹!
參考資料:
謝謝閱讀這篇文章,有問題歡迎在下方留言
Categories:
Basic