SAS 分组与排序

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;

 

posted @ 2019-03-14 09:35  suolilian  阅读(14862)  评论(0编辑  收藏  举报