SAS 分組與排序
SAS對數據集進行操作時,經常需要在SET、MERGE、MODIFY或 UPDATE語句中使用分組數據。使用分組數據最基本的方法是使用BY 語句,其基本形式如下:
BY 變量列表;
BY語句除了可用於DATA步中對數據集進行操作外,也可以用於 SAS PROC步。在這些地方使用分組數據時,要求所有的觀測必須按BY 語句中的變量以數字或字符順序升序或降序排列,或者以某種方式分 組,例如以日歷的月份或格式化后的值為條件進行分組。如果數據不滿 足這個條件,可使用SORT過程對其進行排序分組。
1.使用SORT過程對觀測進行排序
使用SORT過程的基本形式如下:
PROC SORT DATA=輸入數據集 <OUT=輸出數據集> <其他選項>;
BY 變量列表;
RUN;
- ·輸入數據集指定需要排序的數據集。
- ·變量列表指定排序變量,可以是一個變量或多個變量。當指定多個變量時,SAS首先會按照第一個變量分組,然后在同一個分組內依照 變量列表中的其他變量逐個進行排序。
- ·選項OUT=指定存儲排序后數據的新數據集。當該選項不存在時, 排序生成的數據寫入由選項DATA=指定的數據集。輸出數據集可以和 輸入數據集相同,不過此時會覆蓋輸入數據集。當輸出數據集與輸入數 據集不同時,會創建新數據集。
- ·還可以指定其他選項。
- 默認情況下,SAS根據BY變量的值升序排列分組。
對公司員工先按照部門(Dept)名稱進行排序,在同一部門里按照入職日期(Entry_Date)進行排序。
公司員工所在數據集saslib.employee的部分數據如圖3.13所示。該數據集包含員工編號、姓名、所在部門、職位和入職年份。使用SORT過程對該數據集進行排序時,在BY語句中先后指定排序的變量Dept和Entry_Date。
proc sort data=saslib.employee out=saslib.employee_sorted; by Dept Entry_Date; run;
2.使用選項DESCENDING對觀測按變量降序排序
在BY語句中,還可以在每個變量之前指定選項DESCENDING對變 量進行降序排序,或者根據需要對部分變量進行升序排序、部分變量降 序排序。其基本形式如下:
BY <DESCENDING > 變量1 << DESCENDING > 變量2...>;
如果變量前面存在選項DESCENDING,則該變量在組內按降序排序,否則按默認的升序排序。
將saslib.employee中的員工數據按部門名稱進行排序(升序),每個部門內部的入職日期由近到遠進行排序(降序)。代碼 如下:
proc sort data=saslib.employee out=saslib.employee_descending; by Dept descending Entry_Date; run;
3.找到分組中的第一個和最后一個觀測
在使用BY語句時,SAS會自動為BY語句中指定的每個變量生成兩個臨時變量:FIRST.BY變量和LAST.BY變量。當變量值在每個分組中第一次出現時,FIRST.BY變量為1,否則為0;當變量值在每個分組中 最后一次出現時,LAST.BY變量為1,否則為0。通過這兩個變量可以找到分組中的第一個和最后一個觀測,並進行相應的處理。在DATA步中 使用SET語句和BY語句的基本形式如下:
DATA 數據集;
SET 數據集;
BY 變量列表;
...其他語句;
RUN;
取排序生成的saslib.employee_sorted中每個部門最先入職和最后入職的員工,生成新數據集saslib.employee_fl。
代碼如下:
data work.employee_fl; set saslib.employee_sorted; by Dept; if first.Dept or last.dept; run; proc print data=work.employee_fl noobs; run;
4.使用選項NODUPKEY刪除重復BY變量的觀測
使用SORT過程的NODUPKEY可以在對數據集按BY變量進行排序 的同時,刪除數據集中BY變量值相同的觀測。
proc sort data=saslib.contact2_raw out=saslib.contact2 dupout=work.contact2_dup nodupkey; by Name; run; proc print data=saslib.contact2 noobs; title "Observations with Duplicate BY Values Deleted"; run; proc print data=work.contact2_dup noobs; title "Duplicate Observations"; run;
在SAS 分組與排序過程中,需要掌握得關鍵詞為:
proc sort data=work.dataone out=datause uniqueout=uniquedata; by var1 descend var2; first.var1 or last.var1;