Leo Yeh's Blog

SAS 基礎程式 (4)

基本介紹

教學目標

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

重點概念

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

一開始針對資料進行操作,主要可分函數功能和條件處理,首先函數功能讓使用者能夠更方便處理資料,函數的格式為變數=函數名稱(參數1,參數2,…); ,首先 SUM() 函數可以進行加總,重點在於遇到遺漏值會略過,因此建議取代加法使用。接著 MONTH() 函數主要是取得月份,與日期相關函數則有 YEAR()、QTR()、DAY()、WEEKDAY()、…等,其中 WEEKDAY 是 1 至 7,1 為星期日,注意日期相關函數中的參數必須為日期格式,若不小心用到日期加時間的資料時就會發生錯誤,此時就會先用 DATEPART 將日期加時間的資料取出日期部份。再來 TODAY() 和 DATE() 主要是回傳現在的日期,MDY(月,日,年) 主要是回傳日期的數值,此外若我們要計算年齡時除了 365.25 之外還可以用 YRDIF(開始日期,結束日期,’age’) 函數計算出更精確的年齡,以及針對日期或時間的平移則可以透過 INTNX 函數。函數可以在 IF 判斷式中使用,以及可以函數中使用函數的巢狀應用,當函數中使用變數只要有儲存至 PDV 就能進行計算,因此就算在資料步驟中使用 DROP 該變數也不影響。至於更多函數則可以透過 Google 搜尋「sas function and call routine」 關鍵字。接著條件處理則為 IF 條件式 THEN 敘述; ,當條件符合才會進行敘述,主要會在 PDV 讀取每筆資料時進行判斷,直到讀取結束,注意條件判斷若為互斥則建議採用 IF 條件式 THEN 敘述 ELSE IF 條件式 THEN 敘述 ELSE 敘述; ,此外我們在策略上會將機率高的條件式往上先執行,以利增加資料處理效率。接著在進行判斷時大小寫是有區別,此時我們可以透過 UPCASE() 函數將所有資料轉換成大寫在進行判斷,事實上最好在資料清理階段若相關資料不重要時就能先進行處理。然而當我們在符合條件時要進行二個以上的敘述時就必須用 DO 群組 DO; … END; 的方式執行多個敘述,此時要注意文字型變數內容會有 TRUNCATED 問題,也就是資料內容被截掉,此時最好在判斷式之前先採用 LENGTH 敘述宣告文字型變數內容的長度,以利避免資料內容被截掉的問題。

接著針對資料進行合併,主要可分為上下和左右合併的方向,首先上下合併當資料集的結構一樣時只需在 SET 敘述中直接合併多個資料集。同時因為 SAS 是依序讀取至 PDV ,所以可以使用無限多個資料集,其中每當讀取資料集至 EOF 時會將 PDV 中的變數內容清除,再讀取下一個檔案。但是當資料集的結構不一樣時,會將不同資料集的變數合併,並且因為在 PDV 預設會為遺漏值,以及每當讀取資料集至 EOF 時會將 PDV 中的變數內容清除時,也會設定遺漏值,再讀取下一個檔案,因此只要資料集沒有對應的變數內容時,就會設定為遺漏值。可是當我們要將兩個不同變數名稱進行合併時,就會針對該資料集使用 RENAME 敘述將變數名稱重新命名進行對應,注意此過程不會影響原始資料。此外當不同資料集中有相同變數名稱卻沒有統一文字型或數值型格式時就會發生錯誤,當遇到此問題可以用 INPUT 和 PUT 進行解決,其中 INPUT 會將文字轉數字而 PUT 會將數字轉文字,但若有統一類型格式卻沒有相同長度時就會有警告訊息告知會有 TRUNCATED 問題。接著左右合併主要有三種方式,分別為一對一、一對多和不對應,主要皆是針對資料集先透過 SORT 敘述進行排序,接著再透過 MERGE 敘述再搭配 BY 敘述針對特定變數進行資料左右合併,注意所有相關資料集都要有相同鍵值變數,關鍵在於一定要先排序才能進行一對一和一對多,主要在於 PDV 處理流程的方式,此外若我們忘記寫 BY 時不會有警告訊息此時預設會一對一對應,這時我們最好設定 OPTIONS mergenoby=error 才會出現錯誤訊息,避免左右合併邏輯錯誤。至於不對應時則差別在於 PDV 只會儲存排序在前的資料集的資料內容,相當於聯集的應用。可是我們經常會需要進行交集而非聯集,此時就會使用 IN 敘述,IN 中的變數主要代表對於 PDV 有沒有貢獻,只有 0 和 1 的值,當為 1 就是有貢獻,請避免與資料集中的變數名稱相同,這時只要再透過 IN 中的變數進行 IF 敘述的判斷組合達到交集的應用,此外在 IF 敘述執行過程中可以使用 OUTPUT 將 PDV 儲存的資料輸出至不同的資料集,注意當變數不在所有資料集中切記不能使用 WHERE 。

再來針對資料進行摘要,主要可分為頻率和統計,首先透過 FREQ 步驟針對類別型資料進行頻率摘要資訊,主要透過 TABLES 敘述挑選進行摘要的變數名稱,注意 / 後接選擇參數,像是 NOCUM 不顯示累計統計和不顯示 NOPERCENT 百分比顯示,至於要如何選擇變數進行摘要則建議選擇值變化較少,不限於文字型和數字型變數,並且可以透過 FORMAT 敘述協助資料分組。一般來說 TABLES 敘述中的變數可以透過 進行交叉資料表,格式為列欄,此外我們也可以透過 LIST 和 CROSSLIST 選項參數以不同方式進行呈現。接著為了針對進行摘要的資料集找出錯誤,我們可以透過 ORDER=FREQ 進行排序確保唯一值,以及透過 NLEVELS 的選項參數找出遺漏值,最後再以 NOCUM 、 NOPERCENT 和 NOPRINT 先進行資料驗證,待確認無誤之後再印出結果。接著我們可以透過 MEANS 步驟針對連續型資料進行統計摘要資訊,預設會有非遺漏值的筆數 N、平均值 MEAN、標準差 Std Dev、最小值Minimum 和最大值 Maximum,其中我們會透過 VAR 敘述針對數值型變數進行分析和 CLASS 敘述針對類別型變數進行分組,此時當使用 CLASS 敘述進行分組,則會有總筆數 N Obs,此外我們也可以在 MEANS 步驟搭配參數選項宣告顯示的資訊,像是 NMISS、MIN、MAX、SUM、… 等統計資訊,或者直接使用 UNIVARIATE 步驟直接顯示所有與數值型變數相關的統計資訊,以及我們可以透過 OUTPUT 將所有統計摘要資訊,此時最好搭配 CHARTYPE 和 NOPRINT 參數選項,以利增加可讀性和處理效率。

最後 SAS 會將資訊傳送給 ODS 平台再將結果進行輸出,此時我們可以透過 ODS TRACE ON; 步驟找出 ODS 平台中輸出資料集名稱,此時可以再搭配 ODS OUPUT 資料集名稱=輸出資料集名稱的方式將產生的結果輸出成新的資料集,此時就能進行更自動化的進階分析。

步驟說明 WHERE IF
PROC 步驟
DATA 步驟 (SET 敘述)
DATA 步驟 (ASSIGNMENT 敘述)
DATA 步驟 (INPUT 敘述)
DATA 步驟 (SET/MERGE 敘述 (變數在所有資料集中))
DATA 步驟 (SET/MERGE 敘述 (變數不在所有資料集中))

相關資源

⬅️ Go back