[SAS] Data Step

YC Huang
6 min readNov 20, 2023

--

Data step 在SAS是一個常見語句,可以分成兩個部分,compile phase和execution phase,該語句始於 ‘Data’。透過我們給予指令建立資料集,並且加以命名。在compile phase時,SAS會自行進行語法檢查(syntax check),接著判斷語句是否正確,若正確,會進行execution phase。

  • Compile phase: 在這個階段確認語法正確後,SAS會將語句轉換成機器可辨讀的機械碼(machine code),並且自動生成下列三個項目:

(1)input buffer: 輸入暫存區是記憶體中的邏輯區,作為SAS從原始資料集讀取每一筆資料的暫存區。(但若SAS從SAS檔讀取資料時,將會直接到program data vector)
(2)program data vector: 是SAS建置資料集的區域,一次讀取一筆資料。當程式執行時,SAS會從緩衝區讀取資料值或透過執行SAS語句來建立資料集。SAS指派值給程式資料向量中(program data vector)適當的變數。
與此同時,程式資料向量會建立兩個變數_N_和_ERROR_,這兩個變數將部會寫入最終輸出的資料集。_N_作為計算data step 步驟開始的迭代次數;_ERROR_表示執行期間,資料所引起的錯誤訊息。
(3)description info: 是每個SAS資料集的訊息,包含資料屬性和變數屬性。

  • Execution phase: 所有在data step裏面可執行的語句(executable statements)將會在每次迭代時執行一次。若輸入檔包含原始檔案,SAS將直接從輸入暫存區(input buffer)讀取資料,並且將這些值在程式資料向量中(program data vector)指派給適當的變數。SAS 亦會根據程式指令計算新變數的值,並將這些值寫入程式資料向量。 當程式到 data step末時,預設會發生三個操作,而這些步驟使得 SAS 語言和大多數程式語言不同:

(1) SAS 將程式資料向量中的目前觀測值寫入新資料集。
(2) 程式循環回到 DATA 步驟的起始端。
(3) 程式資料向量中的變數被重設為缺失值*。
*注意:
當使用retain時,變數並不會重設成缺失值。
_N_ 和_ERROR_並不會重設為缺失值。

我們來看一下面這個例子:

data weight_club; 
input IdNumber 1–4 Name $ 6–24 Team $ StartWeight EndWeight;
Loss = StartWeight — EndWeight
;
datalines;
1023 David Shaw red 189 165
1049 Amelia Serrano yellow 145 124
1219 Alan Nance red 210 192
1246 Ravi Sinha yellow 194 177
1078 Ashley McKnight red 127 118
1221 Jim Brown yellow 220 .
1095 Susan Stewart blue 135 127
1157 Rosa Gomez green 155 141
1331 Jason Schock blue 187 172
1067 Kanoko Nagasaka green 135 122
1251 Richard Rose blue 181 166
1333 Li-Hwa Lee green 141 129
1192 Charlene Armstrong yellow 152 139
1352 Bette Long green 156 137
1262 Yao Chen blue 196 180
1087 Kim Sikorski red 148 135
1124 Adrienne Fink green 156 142
1197 Lynne Overby red 138 125
1133 John VanMeter blue 180 167
1036 Becky Redding green 135 123
1057 Margie Vanhoy yellow 146 132
1328 Hisashi Ito red 155 142
1243 Deanna Hicks blue 134 122
1177 Holly Choate red 141 130
1259 Raoul Sanchez green 189 172
1017 Jennifer Brooks blue 138 127
1099 Asha Garg yellow 148 132
1329 Larry Goss yellow 188 174
;
run;
  • Step 1: SAS會根據指令生成指定的變數(包含需要計算的變數Loss),並將所有的變數設定為空值。
  • Step 2: 根據input statement設定的變數給予合適的值,Loss保持為空。
  • Step 3: 接著,SAS會根據程式碼的指令進行運算Loss=StartWeight-EndWeight
  • Step 4: SAS會將計算好的值分派給適當的變數。
  • Step 5: 程式將執行到最尾端(run語句),並
    (1)將第一個觀測值輸出到最終資料集當中
    (2)迴圈再度從data step起始開始
    (3)令_N_=_N_+1,並根據新的_N_,進入新的迭代
    (4)重設_ERROR_=0
    (5)除了_N_和_ERROR_外,其他變數均設置為空

參考資料: https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/basess/n053a58fwk57v7n14h8x7y7u34y4.htm

--

--

YC Huang

嗨嗨我是一個喜歡資料視覺化的小小工程師,目前專注於SAS和臨床統計,希望文章能更多關於什麼主題呢?歡迎留言給我