设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1599|回复: 0

SAS 分组与排序

[复制链接]

18

主题

187

金钱

294

积分

入门用户

发表于 2019-6-20 13:49:39 | 显示全部楼层 |阅读模式

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


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

1.使用SORT过程对观测进行排序
使用SORT过程的基本形式如下:
  1. PROC  SORT  DATA=输入数据集  <OUT=输出数据集>   <其他选项>;
  2. BY  变量列表;
  3. RUN;
复制代码

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

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


2.使用选项DESCENDING对观测按变量降序排序
在BY语句中,还可以在每个变量之前指定选项DESCENDING对变 量进行降序排序,或者根据需要对部分变量进行升序排序、部分变量降 序排序。其基本形式如下:
  1. BY  <DESCENDING  >  变量1  <<  DESCENDING  >  变量2...>;
复制代码

如果变量前面存在选项DESCENDING,则该变量在组内按降序排序,否则按默认的升序排序。

将saslib.employee中的员工数据按部门名称进行排序(升序),每个部门内部的入职日期由近到远进行排序(降序)。代码 如下:
  1. proc  sort  data=saslib.employee  out=saslib.employee_descending;
  2. by Dept  descending  Entry_Date;
  3. run;
复制代码


3.找到分组中的第一个和最后一个观测
在使用BY语句时,SAS会自动为BY语句中指定的每个变量生成两个临时变量:FIRST.BY变量和LAST.BY变量。当变量值在每个分组中第一次出现时,FIRST.BY变量为1,否则为0;当变量值在每个分组中 最后一次出现时,LAST.BY变量为1,否则为0。通过这两个变量可以找到分组中的第一个和最后一个观测,并进行相应的处理。在DATA步中 使用SET语句和BY语句的基本形式如下:

  1. DATA  数据集;
  2. SET  数据集;
  3. BY  变量列表;
  4. ...其他语句;
  5. RUN;
复制代码

取排序生成的saslib.employee_sorted中每个部门最先入职和最后入职的员工,生成新数据集saslib.employee_fl。

代码如下:
  1. data  work.employee_fl;
  2. set  saslib.employee_sorted;
  3. by   Dept;
  4. if first.Dept  or  last.dept;
  5. run;
  6. proc  print  data=work.employee_fl  noobs;
  7. run;
复制代码


4.使用选项NODUPKEY删除重复BY变量的观测
使用SORT过程的NODUPKEY可以在对数据集按BY变量进行排序 的同时,删除数据集中BY变量值相同的观测。
  1. proc  sort  data=saslib.contact2_raw out=saslib.contact2 dupout=work.contact2_dup nodupkey;
  2. by   Name;
  3. run;
  4. proc  print  data=saslib.contact2  noobs;
  5. title  "Observations  with  Duplicate  BY  Values  Deleted";
  6. run;
  7. proc  print  data=work.contact2_dup  noobs;
  8. title  "Duplicate  Observations";
  9. run;
复制代码


在SAS 分组与排序过程中,需要掌握得关键词为:
  1. proc sort data=work.dataone out=datause uniqueout=uniquedata;  
  2. by  var1 descend var2;   
  3. first.var1 or last.var1;
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表