公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2015年8月30日 星期日

Colon(:)izing My Programs

原文載點:http://support.sas.com/resources/papers/proceedings15/3367-2015.pdf

冒號( : )在SAS的資料處理中扮演了一個鮮為人知的角色。這一篇2015年在SAS Global Forum發表的技術文件介紹了如何適當的使用冒號在SAS程式裡面。我列了幾個一般使用者比較會用到的功能。

1) Data Name Wild Card
當一個library裡面有許多SAS資料集擁有相同的開頭檔名但有不同結尾檔名,在使用一個DATA STEP來縱向合併資料時可以用冒號來取代所有檔名。比方說若有五個資料集名為ST_FL, ST_MD, ST_TX, ST_VA, ST_WA,這五個資料很明顯的有相同的開頭檔名(ST_),但有不同的檔尾。所以在SET語法後不需要一個個把這五個資料集名稱打出來,而是用ST_:來取代。例如:

同樣的觀念也可以在使用PROC DATASETS程序刪除SAS資料集時使用。例如:

這個範例還看不出冒號的威能,但試著想說若有一千個ST_開頭的資料集,若要合併或刪除時,使用冒號就可以省下許多打字的時間。

2) Variable Name Wild Card
既然冒號可以用在資料集,則當然也可以使用在變數名。例如,變數名稱都是以sbp開頭或dbp開頭,則sbp:和dbp:就可以代表所有以sbp和dbp開頭的變數。如下所示:

基本上這種用法也可以使用在SAS函數或PROC程序裡面。比方說若要用sum( ), mean( ), max( ), min( )等函數算所有sbp開頭變數的總和或平均數以及最大最小值,抑或是要用PROC PRINT列印這些變數,則用sbp:在函數裡面或VAR語法後面就不需把所有變數一個一個打出來。如下所示:

3) Creating Macro Variables
通常在製作巨集變數時,都需要開一個DATA STEP然後用CALL SYMPUT函示來定義。但在PROC SQL程序中,我們可以直接用冒號加上巨集變數名來直接定義巨集變數,如下所示:

很明顯的:id_vit在PROC SQL裡面變成一個巨集變數來表示所有的ID,因此在其他程式就可以直接用&id_vit來呼叫出那些ID。

4) Operator Modifier
有時在大筆資料裡面有找出某些特定的數據,若沒有知道完整資訊,的確有如大海撈針。但使用冒號可以節省一些時間。比方說要找出ID開頭是字串型態的'0',則在ID=和'0'之間加上一個冒號即可:

這樣一來'012'和'007'這兩個'0'開頭的ID就被找了出來。有時候可能因為轉檔的問題,數值型的ID被轉成字串,則要找出某一區段的ID時,需要先把變數換成數值型才行。但使用冒號的話可以省去這個步驟。比方說我們要從一個三位數但卻是字串型的ID裡面列印出669~999這些數據,若是數值型ID的話可以輕鬆的用WHERE 669<=ID<=999;來列印,但在字串型ID下,直接在"<="符號後面加上冒號即可。如下所示:


5) Colon Modifier
在使用CARDS;或DATALINES;輸入資料時,我們在INPUT statement後面需要定義每個變數的名稱,屬性以及長度。每個變數預設是用空白分開,但有時候我們會遇到以其他符號(比方說逗號)分開的資料,則這可以使用DLM=來處理,可是當每一筆資料在某變數長度不一致時,特殊符號在較短的數據中會被當成資料一樣讀進去,這樣後面的變數會通通錯位,最終導致資料輸入失敗。因此若遇到這個情況,可在長度前面加上一個冒號,則SAS會自動判斷每個變數的長度,當遇到較短的數據時,SAS一讀到分隔符號,就會跳到下一個變數去讀。如下所示:

在此例中,第一個name字串變數長度為7,但第一個數據(AAAAA)長度只有5,因此需要在$7前面加上一個冒號,否則SAS會把AAAAA,M讀進name變數裡面。

6) Array Variable Name Wild Card and Array Bound Delimiter
冒號也可以用在ARRAY後面定義一場串變數名稱時。比方說我們有變數名稱從year1901到year2015,則使用短短的year:就可以替代這115個變數。如下所示:

CONTACT INFORMATION 
Jinson J. Erinjeri
The Emmes Corporation
401 N Washington St.
Rockville, MD 20850
Work Phone: 301-251-1161(x 2917)
E-mail: jerinjeri@emmes.com
Web: www.emmes.com
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }