Leo Yeh's Blog

SAS 基礎程式 (8)

教學目標

初步了解 SAS 基礎程式如何有效進行資料清理或匯整。

重點概念

(請注意以下內容皆為課程心得筆記,若有不清楚的部份,建議上官方主辦的 SAS Programming 2 課程,謝謝。)

在實務應用中我們經常會需要進行資料清理或匯整,此時我們就會透過 SAS 函數進行資料清理或匯整,以利提升資料品質。首先我們試想情境當部門經理需要加總今年每季數據,此時該如何撰寫 SAS 程式呢?此時我們可以透過 of 一次指定多個欄位,試著撰寫加總今年每季數據 SAS 程式,其中會透過 SUM 函數計算加總值,當然我們也可以使用 MEAN 函數計算平均值、 MIN 函數計算最小值和 MAX 函數計算最大值,至於 Numeric 主要是在 PDV 中會建立數值資料所有變數, - 主要是在 PDV 中會建立 Q1 至 Q4 所有變數,變數名稱一定為 Qn,— 主要是在 PDV 中會建立 Q1 至 Q4 所有變數,變數名稱不一定為 Qn,以及 Q: 主要是在 PDV 中會建立 Q 開頭的所有變數。

1
2
3
4
5
6
7
8
9
10
11
12
DATA sales (DROP=Q1 Q2 Q3 Q4);
INPUT Q2 Q3 Q1 Q4 @@;
Total_A = SUM(of _Numeric_)
Total_B = SUM(of Q1-Q4)
Total_C = SUM(of Q2--Q4)
Total_C = SUM(of Q:)
DATALINES;
2000 1800 2400 1900
;
RUN;
PROC PRINT;
RUN;

輸出結果

Obs Total_A Total_B Total_C Total_D
1 8100 8100 8100 8100

接著想情境當部門經理要要針對供應商相關資訊取得特定資訊和顯示特定樣式,此時該如何撰寫 SAS 程式呢?我們就會透過常用的 SAS 函數取得特定資訊,請參考下表:

函數名稱 使用方式 重點概念
SUBSTR SUBSTR(文字或變數,起始位置<,長度>); 主要是取得文字中指定位置的文字,若長度省略不寫代表取至結束為止,請注意若字串變數長度為 N,那麼 SUBSTR之後變數長度還是為 N,此外若將 SUBSTR 寫在等號左方則代表取代的功能。
SCAN SCAN(字串,第幾個位置<,分隔符號>); 主要是從文字中以分隔符號分割之後第幾個位置,若沒有則是遺漏值 (MISSING),若是負數則是從後面開始找起,而 SAS 9.4 版本之後是根據變數長度為主,而非預設長度為 200,在第一個文字前的分隔符號皆無效,分符號也可以使用任何字元,當多個分隔符號連續出現時只會視同一個分隔符號,此外若將 SCAN 寫在等號左方則代表取代的功能
TRANWRD TRANWRD(來源文字,目標文字,取代文字); 主要是取代多個位置的資料,不會移除尾部空白,預設長度為 200,若文字找不到目標文字就不會取代文字。
LENGTH LENGTH(文字); 主要是計算後面非空白的長度,例如:LENGTH=’ ALICE ‘; 則長度為 7,通常會和 SUBSTR 搭配使用取得變數文字的長度。
PROPCASE PROPCASE(文字<,分隔符號>); 主要是將文字轉為第一個字母大小,其它是小寫,請注意若使用分隔符號則預設分隔符號就會失效,例如 PROPCASE(Name,’ *&’);
UPCASE UPCASE(文字); 主要是將文字轉為大寫。
LOWCASE LOWCASE(文字); 主要是將文字轉小寫。
RIGHT RIGHT(文字); 主要是將文字靠右。
LEFT LEFT(文字); 主要是將文字靠左。
CHAR CHAR(文字,起始位置); 主要只讀取單一字元。
FIND FIND(文字,文字1<,忽略大小寫(I)/去除尾部空白(T),開始位置>); 主要是回傳文字1 在文字中的位置,此外 FIND 與 SCAN 的差別在於 FIND 是回傳位置,而 SCAN 是回傳文字1,若回傳 0 代表沒有找到。
COMPRESS COMPRESS(文字<,字元>); 主要將字元移除,以利進行壓縮,其中字元可以為多個。
TRIM TRIM(文字); 主要是去除尾部空白。
STRIP STRIP(文字); 主要是去除頭尾空白。
COMPBL COMPBL(文字); 主要進行空白壓縮,若有兩個空白則會壓縮為一個空格。
CATX CATX(分隔符號,文字1,文字2); 主要連接文字,文字之間的空白會移除,同時加上分隔符號,預設長度為 200。
CAT CAT(文字1,文字2); 主要連接文字,文字頭尾的空白不會移除。
CATS CATS(文字1,文字2); 主要連接文字,文字頭尾的空白會移除。
CATT CATT(文字1,文字2); 主要連接文字,文字尾部的空白會移除。
CATQ CATQ(類型<,分隔符號>,文字1,文字2); 主要連接文字,可以採用不同類型的 CAT 函數。

在 SAS 中函數是可以多元搭配使用但是請注意 ( ) 括號的對應位置和數量,至於要如何透過 SAS 函數滿足主管的需求呢?一般來說,我們會透過函數更進一步匯整資料,像是匯整競爭者資料或聯絡資料,通常會先透過 INFILE 敘述和 INPUT 敘述讀取資料,接著需要透過 SUBSTR 和 LENGTH 函數取得關鍵代表碼判斷分類資訊,同時透過 PROPCASE、UPPERCASE、LOWCASE 函數轉換英文顯示方式,再來先分散再合併,主要透過 SCAN 函數取得特定文字的資料,以及透過 CAT 函數或連接符號 || 或 !! 主要是連接文字資料,其中 CAT 和連接符號的差別在於 CAT 長度預設為 200 ,而連接符號長度會依照連接文字的長度為主,需要特別注意數值會自動轉換文字長度預設為 8,此外我們還能夠再透過 TRANWRD 函數取代所有關鍵字,或者透過 STRIP 、TRIM 、COMPBL 、…等函數移除空白資料,以利提升資料品質,最後透過 FILE 敘述和 PUT 敘述將匯出整理之後的高品質資料,這不僅僅是匯整資料,更是我們常常所提到的資料清理以利確保資料的品質,有助於商業分析結果可信度提高。

總結在 SAS 中撰寫程式時,我們可以動點頭腦思考看看如何透過內建的 SAS 函數有效清理或匯整資料,以利提升資料的品質,將有助於商業分析結果可信度提高,因此 SAS 函數的使用是件非常重要的基本功。

相關資源

⬅️ Go back