什麼是DATA STEP?
SAS資料處理的心臟
主要用來進行資料處理的語法,包括建立、修改及轉換資料
Data Step與Proc Step
是SAS中用來進行資料處理的語法,由Data語法與依附在Data Step下的語法所組成
建立資料
建立單個/多個不同屬性資料集
修改
修改變數格式及標籤、觀察值
轉換
資料計算、重新分組
在SAS中,與之相對的是「Proc Step」,由程序(Procedure)所建立的語法,在官方的語法文件中你所看到的Proc開頭都是Proc Step。
Proc Step在SAS中擔任的角色主要是資料分析、圖表產出的功能,但其實它也能執行部分的資料處理功能哦!例如:Proc Transpose,它可以把資料在橫式與直式之間進行轉換。
Data Step程式碼
Data test;
* --- Multiple Statements ---;
run;
以上是最簡單的Data Step程式碼:
- Data為Data Step必要的keyword,也是告訴SAS我們要開始執行Data Step
- test是指我們要透過Data Step來建立一個名為test的資料集(Dataset),但SAS的資料集命名有特別的規則必須遵守,其中一條是不得超過32個位元組
- 中間灰底的字則是可以放入可以在Data Step中使用的各種語法
- run是告訴SAS去執行以上的程式,並不是必要的,但可以用來幫助辨別不同區塊的Data Step
請注意到每行語法後方都有一個分號「;」,這個分號是告訴SAS這一句語法的結束,這一行語法又稱作Statement(敘述句),在上方的程式中共有2個敘述句「Data test;」與「run;」。
Phase
在背後運作分為兩個階段,Compile Phase(編譯階段)與Execution Phase(執行階段),執行順序是先執行Compile Phase後再執行Execution Phase
Compile Phase
顧名思義,在這個階段就是將程式碼編譯成SAS讀得懂的內容,在這裡我們並不需要去瞭解SAS把程式碼轉成什麼內容,只要知道在這一個階段中SAS做了什麼。
不管你是使用SAS base、SAS Enterprise Guide、SAS Studio,在按下「執行(run)」按鈕後:
- 檢查所執行程式碼是否有語法錯誤(Syntax Error),發生時終止目前執行程式,語法錯誤指的是不符合SAS規則的語法
- 在記憶體建立Input Buffer、Program Data Vector(PDV)、Descriptor Information這3個區塊
Execution Phase
SAS正式執行的階段,較Compile Phase複雜
- 讀取資料
- 資料來源是透過Input敘述句讀取非SAS資料集,繼續執行c
- 有>資料寫入Input Buffer,繼續執行ii
- 無>SAS自動建立2個變數(_N_、_Error_),將PDV所有變數設為遺漏值,將Input Buffer資料寫入PDV
- 資料來源為SAS資料集,繼續執行c
- SAS自動建立2個變數(_N_、_Error_),PDV所有變數設為遺漏值,將資料直接寫入PDV
- 在Descriptor Information建立資料集的資訊,包含資料集與變數屬性
- 資料來源是透過Input敘述句讀取非SAS資料集,繼續執行c
- 由上往下繼續執行其他可執行敘述句
- 碰到「run;」或是另一個Data Step、Procedure時,將該筆資料從記憶體寫入到新建立的資料集
- 反覆執行1~3直到沒有任何觀察值可以被讀取後,停止當前的Data Step
圖解
圖片來源:How the DATA Step Works: A Basic Introduction
實例
接下來我們以實例來拆解、說明每一步吧!
Data test;
input No Gender $ Score;
cards;
1 F 66
2 M 91
3 F 28
4 F 59
5 M 99
;
run;
以上是使用3個變數、讀取cards敘述句以下5筆資料後,建立「test」SAS資料集的程式。
- 在開始讀取第1筆資料時,因為有使用到Input敘述句讀取非SAS資料集,所以先建立Input Buffer
- 依照所定義的屬性建立變數
- 將第1筆資料寫入到Input Buffer
- 依照Input敘述句的變數建立PDV
- 將PDV的變數設為遺漏值
- 自動變數_N_被賦值為1;自動變數_error_被賦值0
- 將資料從Input Buffer由左到右寫入到PDV
- 當這1筆資料的所有變數都被寫到PDV後,將這筆資料寫進新資料集
- 因為資料還有第2筆,所以會回到Data Step最上方準備讀取資料
- 自動變數_N_會自動+1
- 如果過程沒有出現錯誤,自動變數_Error_會被重設為0
- 繼續將第2筆觀察值寫入Input Buffer
- 將資料從Input Buffer由左到右寫入到PDV
- 當這1筆資料的所有變數都被寫到PDV後,將第2筆資料寫進新資料集
- 反覆以上步驟,直到沒有資料可以被讀取時,SAS關閉資料集
- 向下執行其他Data Step或Procedure
參考資料:
How the DATA Step Works: A Basic Introduction
謝謝閱讀這篇文章,有問題歡迎在下方留言