志当存高远i 发表于 2019-6-20 13:49:39

SAS 分组与排序


SAS对数据集进行操作时,经常需要在SET、MERGE、MODIFY或 UPDATE语句中使用分组数据。使用分组数据最基本的方法是使用BY 语句,其基本形式如下:
BY变量列表;

BY语句除了可用于DATA步中对数据集进行操作外,也可以用于 SAS PROC步。在这些地方使用分组数据时,要求所有的观测必须按BY 语句中的变量以数字或字符顺序升序或降序排列,或者以某种方式分 组,例如以日历的月份或格式化后的值为条件进行分组。如果数据不满 足这个条件,可使用SORT过程对其进行排序分组。

1.使用SORT过程对观测进行排序
使用SORT过程的基本形式如下:
PROCSORTDATA=输入数据集<OUT=输出数据集>   <其他选项>;
BY变量列表;
RUN;
·输入数据集指定需要排序的数据集。
·变量列表指定排序变量,可以是一个变量或多个变量。当指定多个变量时,SAS首先会按照第一个变量分组,然后在同一个分组内依照 变量列表中的其他变量逐个进行排序。
·选项OUT=指定存储排序后数据的新数据集。当该选项不存在时, 排序生成的数据写入由选项DATA=指定的数据集。输出数据集可以和 输入数据集相同,不过此时会覆盖输入数据集。当输出数据集与输入数 据集不同时,会创建新数据集。
·还可以指定其他选项。
默认情况下,SAS根据BY变量的值升序排列分组。


对公司员工先按照部门(Dept)名称进行排序,在同一部门里按照入职日期(Entry_Date)进行排序。
公司员工所在数据集saslib.employee的部分数据如图3.13所示。该数据集包含员工编号、姓名、所在部门、职位和入职年份。使用SORT过程对该数据集进行排序时,在BY语句中先后指定排序的变量Dept和Entry_Date。
procsortdata=saslib.employeeout=saslib.employee_sorted;
by   DeptEntry_Date;
run;

2.使用选项DESCENDING对观测按变量降序排序
在BY语句中,还可以在每个变量之前指定选项DESCENDING对变 量进行降序排序,或者根据需要对部分变量进行升序排序、部分变量降 序排序。其基本形式如下:
BY<DESCENDING>变量1<<DESCENDING>变量2...>;
如果变量前面存在选项DESCENDING,则该变量在组内按降序排序,否则按默认的升序排序。

将saslib.employee中的员工数据按部门名称进行排序(升序),每个部门内部的入职日期由近到远进行排序(降序)。代码 如下:
procsortdata=saslib.employeeout=saslib.employee_descending;
by DeptdescendingEntry_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。

代码如下:
datawork.employee_fl;
setsaslib.employee_sorted;
by   Dept;
if first.Deptorlast.dept;
run;
procprintdata=work.employee_flnoobs;
run;

4.使用选项NODUPKEY删除重复BY变量的观测
使用SORT过程的NODUPKEY可以在对数据集按BY变量进行排序 的同时,删除数据集中BY变量值相同的观测。
procsortdata=saslib.contact2_raw out=saslib.contact2 dupout=work.contact2_dup nodupkey;
by   Name;
run;
procprintdata=saslib.contact2noobs;
title"ObservationswithDuplicateBYValuesDeleted";
run;
procprintdata=work.contact2_dupnoobs;
title"DuplicateObservations";
run;

在SAS 分组与排序过程中,需要掌握得关键词为:
proc sort data=work.dataone out=datause uniqueout=uniquedata;
byvar1 descend var2;   
first.var1 or last.var1;
页: [1]
查看完整版本: SAS 分组与排序