|
SAS对数据集进行操作时,经常需要在SET、MERGE、MODIFY或 UPDATE语句中使用分组数据。使用分组数据最基本的方法是使用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;
复制代码 |
|