Leo Yeh's Blog

SAS 基礎程式 (3)

基本介紹

教學目標

初步了解 SAS 基礎程式如何進行資料集處理。

重點概念

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

首先針對資料集使用者可以自定義格式,主要會透過 PROC FORMAT 步驟程式中的 VALUE 敘述設定格式名稱,只能最多 32 個字元,文字型態格式會以 $ 開頭,之後會接字母和底線,數字型態格式開頭接字母和底線,不能以數字結束,不能與 SAS 預設格式名稱相關,每個範圍設定可以為單一值、範圍值和清單值,標籤名稱最多可達 32,767 字元長度,並且要用引號,其中 other 關鍵字一定寫在最後,並且不能加 ‘’ 引號。此外當有值沒有被定義時則會顯示原始值,此外預設 w 代表格式長度,若太短則會以左右兩邊最長的文字為主,以及若還是長度過短時就會進行四捨五入,但是若是範圍則要設定連續區間時,就會應用 < 運算子代表包含左邊值,並且利用 low 和 high 代表最低值和最高值,以及當 PROC PRINT 使用時使用者自定義的格式名稱後一定要加 . ,才能夠正常執行,此外使用者自定義的格式預設會儲存在 WORK,此時可以透過 LIBRARY 進行使用者自定義的格式的儲存設定。

接著針對資料集使用者可以產生新資料,主要會透過 DATA 步驟程式主要是產生新的資料集,首先資料集名稱英數字加底線長度不能超過 32 個字元,透過 SET 敘述讀取所有觀察值和變數來自於輸入的資料集,此外觀察值是依循讀取,一次只會讀一筆,當產生資料集成功之後,日誌就會顯示讀取多少觀察值和變數。在 DATA 中使用指定敘述重點在於有算術運算,包括指數**、乘法、除法、加法和減法,產生新的欄位,注意當有遺漏值時則運算後的結果一定為遺漏值,此外透過 DROP 敘述和 KEEP 敘述就能夠進行變數篩選,此時 KEEP 中一定要包括產生新的欄位。DATA 步驟處理背後的邏輯對於 SAS 程式撰寫非常重要,一段 SAS 資料集送出時會經過 Compilation 階段和 Execution 階段,首先 Compilation 階段會先檢查語法是否正確,並且轉換程式為機器語言,接著在記憶體中建立 Program Data Vector (PDV) 產生資料集儲存一筆觀察值資料,最後建立輸出資料集的 Descriptor Portion。一個步驟中敘述的順序是不重要,尤其只適用 Compilation 階段的語法,像是 DROP 敘述和 KEEP 敘述,因為會統一至 RUN; 才會執行步驟。當 Compilation 階段執行完成之後 會進行 Execution 階段,首先會先將 PDV 值初始化為遺漏值,接著一筆一筆檢查是否符合 WHERE 條件再儲存至 PDV 中,接著初始化新變數,初始化為遺漏值,此時 PDV 永遠會有一筆資料儲存,採覆蓋的方式,最後就會一筆一筆依序輸出至資料集中。因此 WHERE 敘述條件篩選只能判斷原始欄位,此時必須使用 IF 敘述條件篩選主要是在資料流的方面針對當下 PDV 是否符合,符合才能夠輸出至資料集,否則就跳下一筆進行 PDV 處理,此時 IF 所在步驟中的順序位置就非常的重要,以及雖然所有條件皆能在 IF 敘述處理,但是處理效能會比 WHERE 敘述處理效能較差。此外我們也可以針對資料集設定永久標籤預先定義,這時當 PROC PRINT 加上 LABEL 就會顯示永久標籤,當然還有永久格式預先定義就能針對該變數以該格式直接顯示,並且不論是永久標籤或永久格式會繼承原始資料集。

再來針對資料集使用者可以從 Excel 檔中讀取資料,基本概念為將檔案模擬為資料館,其中不同的分頁模擬資料集,主要在使用 LIBNAME 敘述時宣告為 LIBNAME 資料集 excel “檔案路徑” 或 LIBNAME 資料集 pcfiles path=”檔案路徑”,差別在於若 SAS 軟體和 Office 軟體安裝電腦位元數不同時,則只能使用 pcfiles ,此時則要安裝 PC 檔案伺服器引擎,使用之前必須要有 SAS/ACCESS Excel 引擎的授權才能夠使用。當 Excel 檔案載入至資料集之後,我們主要會使用有 $ 的完整分頁資料集,這時當我們要使用資料集時,則要採用 Name Literals 的方式進行存取,例如:’Sheet1$’n,接著就能當成資料集進行操作,包括透過資料集,工作表名稱的方式直接輸出結果至 Excel 檔案中,只差別在於資料集無法被覆寫,因為是唯讀狀態,同時也會被 SAS 給鎖定,這時就要透過 LIBNAME 資料集 CLEAR 敘述程式釋放 Excel 檔案。當然除了從 Excel 檔讀取資料之外,SAS/ACCESS 更有支援不同資料庫的引擎,宣告為 LIBNAME 資料集 資料庫引擎 參數選項,至於是否能夠進行寫入資料則是資料庫中使用者權限的問題。

以及針對資料集使用者可以讀取從 Raw Data 檔案中讀取資料,通常有多筆資料記錄,且在資料中不會建立內部 Metadata,因此會使得 SAS 程式相對 Excel 檔案和資料庫處理相對複雜,主要可分為以分隔符號隔開的型式為 Delimited File 和固定欄位長度的型式為 Fixed Column File,至少要宣告資料儲存在哪,如何讀取的方式,對應變數名稱和型態有哪些,其中讀取的方式主要可分為 Column Input 、 Formatted Input 和 List Input ,其中 Column Input 僅能用於固定欄位長度的標準資料格式,Formatted Input 可用於固定欄位長度的標準資料格式和非標準資料格式,所謂非標準資料格式,List Input 則用於分隔符號的標準資料格式和非標準資料格式。首先讀取 Raw Data 檔案時先確認資料為標準格式或非標準格式,接著主要會透過 INFILE 敘述讀取檔案的來源,再來以 DLM 宣告分隔符號。當宣告完檔案來源之後,緊接著會透過 INPUT 敘述宣告變數名稱和型態,型態若有 $ 為文字型態,否則為數字型態,注意預設變數長度皆為 8 個字元。當我們讀取 Raw Data 檔案時在 Compilation 階段當轉成機器碼之後,此時會先建立輸入緩衝區暫存從 Raw Data 檔案讀取一次的一筆記錄,接著再建立 PDV,最後建立 Descriptor Portion 輸出資料集。當 Compilation 階段執行成功之後,緊接著進行 Execution 階段,此時會執行 INPUT 敘述進行切割,再將資料儲存至 PDV 中,再回到 DATA ,此時會先初始化 PDV ,不清除輸入緩衝區的資料,持續進行直接 Raw Data 檔案讀取完畢就輸出至資料集,也因此差別在於輸入緩衝區。至於緩衡區預設大小則可以透過 LRECL 進行輸入緩衝區大小設定,預設為 32767,然而我們也可以在 INPUT 敘述之前宣告 LENGTH 宣告每個變數的大小,注意 LENGTH 敘述一定要在 INPUT 敘述之前,主要和 Compilation 階段處理流程有關,以及 LENGTH 敘述宣造的變數會先放置,之後才會放置 INPUT 敘述中不存在 LENGTH 敘述中的變數,此外在處理過程中可以透過 PROC CONTENTS DATA=資料集 VARNUM; RUN; 了解資料集欄位的順序。以及 SAS 當讀取檔案錯誤資料時會顯示幾筆資料錯誤的 NOTE,有助於我們進行除錯,注意當資料錯誤時不影響執行後續步驟,並且資料處理過程中會有 N 代表 DATA 步驟繞第幾趟, ERROR 代表讀某筆資料時有沒有正常讀取成功,0 為成功,1 為失敗,注意 SAS 會透過 ERRORS 選項參數設定錯誤的上限,預設為 20,代表只會印出前 20 個錯誤,此時我們可以透過 OPTIONS ERRORS=2; 敘述暫時性修改,若要一次修改則要修改設定檔。

最後非標準資料處理與標準資料處理,差別在於 INPUT 敘述時針對每個變數宣告輸入格式 <$>.,此時避免輸入切割錯誤,一定會搭配冒號 (:) 告知要用分隔符號進行切割,一般來說 代表讀資料時寬為多少可以省略,因為有分隔符號若有搭配冒號 (:) 則不會影響,接著若要進行觀察值的篩選只能使用 IF,最後我們可以透過 DATALINES 敘述讀取 In Stream 的資料,注意要寫在最後,此方式能解決因為編碼導致傳送資料錯誤的問題,透過 DSD 參數選項會將連續分隔符號之間加入遺漏值,再將分隔符號會統一改成逗號,以及將雙引號刪除,但若資料讀取結尾不完整時 MISSOVER 參數選項會將結尾不完整變數皆以遺漏值為主,因此 DSD 和 MISSOVER 非常實用建議與 INFILE 搭配使用。

步驟說明 WHERE IF
PROC 步驟
DATA 步驟 (SET 敘述)
DATA 步驟 (ASSIGNMENT 敘述)
DATA 步驟 (INPUT 敘述)

相關資源

⬅️ Go back