【05】資料處理必備 – Functions與Call Routines

Functions & Call Routines

接收參數、回傳值

SAS內建元件之一,提高資料處理的效率


函數 – 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數量十分龐大,這邊介紹個人在進行資料處理時較常使用的種類

數值處理

SUMsum(Argu1, Argu2, …)加總所有參數
INTint(Argu)取整數
ROUNDround(Argu <, Rounding-unit>)四捨五入
FLOORfloor(Argu)傳回小於參數的最大整數值
CEILceil(Argu)傳回大於參數的最大整數值

文字處理

UPCASEupcase(Argu)傳回參數的大寫值
LOWCASElowcase(Argu)傳回參數的小寫值
SUBSTRsubstr(string, position <, length>)從第P位擷取L個字元
COMPRESScompress(source ,< characters> ,< modifier(s)>)刪除特定字元後回傳
TRANWRDtranwrd(source, target, replacement)以特定字元替換目標字元後回傳
CATXcatx(delimiter, Argu-1 <, … Argu-n>)刪除前導與尾隨空白後插入指定分隔符號回傳
CALL CATXcall catx(delimiter, Result, Argu-1 <, … Argu-n>)刪除前導與尾隨空白後插入指定分隔符號回傳到指定變數
CATScats(Argu-1 <, … Argu-n>)刪除前導與尾隨空白後回傳
CALL CATScall cats( result <, Argu-1, …, Argu-n>)刪除前導與尾隨空白後回傳到指定變數

搜尋

INDEXindex(source, excerpt)傳回source中符合excerpt字串的第一個位置
FINDfind(string, substring <, modifier(s)> <, start-position>)從指定的位置開始搜尋,傳回string中符合substring字串的第一個位置
SCANscan(string, count <, character-list <, modifier>>)傳回string中,依照character-list計數的第count個字元

時間日期

TIMEtime()無需參數,傳回目前的時間
TODAYtoday()無需參數,傳回目前的日期
DATEPARTdatepart(datetime)擷取日期時間的值後,回傳日期值
DAYday(date)回傳日期值的當月第N天
MONTHmonth(date)回傳日期值的當年第N個月
YEARyear(date)回傳日期值的N年(西元制)
MDYmdy(month, day, year)放入月、日、年的值後,回傳完整的日期值

其實還有眾多沒有談到的種類,之後會盡量以主題的方式來介紹!


參考資料:

Functions and Call Routines

謝謝閱讀這篇文章,有問題歡迎在下方留言

Categories: Basic