设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1509|回复: 0

SAS创建和使用索引(SAS INDEX)

[复制链接]

23

主题

175

金钱

287

积分

入门用户

发表于 2019-8-15 14:45:41 | 显示全部楼层 |阅读模式

一、概述
在合并数据集的时候,可以使用DATA步,但使用DATA 步时需要对KEY VALUE 排序,且KEY VALUE 的名字也必须一致;
也可以用PROC SQL ,不需要进行上述排序、重命名的步骤。 当数据量较小时使用哪种方式都不会影响代码的执行效率,但
1000万行且存在上百变量时上述code的执行效率严重下降。此时若使用index 则会提高代码运行效率。
INDEX 分为简单索引和复杂索引,也可以创建临时索引和永久索引(永久索引一但创建创功,就在文件存储地生成一个.sas7bndx的索引文件)


二、创建索引的方法:
1、DATA 步创建索引
使用(index=)选项在DATA 步创建索引,如下:
显式索引(Explicitly) INDEX=(ID/UNIQUE)
隐式索引(Implicitly) INDEX=(ID)
注:使用显失索引时,若KEY VALUE 不唯一,则会在log 页面生成错误信息。(故推荐用显式索引)。

简单索引:
  1. DATA  score(INDEX=(student_id));
  2.     SET test;
  3. RUN;
复制代码


也可以同时创建多个简单索引:
  1. DATA  score(INDEX=(student_id class));
  2.     SET test;
  3. RUN;
复制代码


复杂索引:
  1. DATA  score (INDEX = (INDEX_NAME = (ID CLASS))/UNIQUE);
  2.     SET test;
  3. RUN; *INDEX_NAME  是创建的复杂索引的名字。
复制代码


2、PROC DATASETS 步创建索引(为已存在的sas数据集创建索引,执行时间快,因为只读取KEY VALUE)
  1. PROC DATASETS  LIBRARY=;
  2.         MODIFY data_set_name;
  3.         INDEX CREATE var/UNIQUE        NOMISS; *var是创建索引的key value;
  4.         INDEX CREATE index_name=(var1 var2)/UNIQUE;
  5. QUIT;

  6. 注:在PROC DATASET 中删除索引用INDEX DELETE;
复制代码


3、在PROC SQL 中创建索引;
  1. PROC SQL ;
  2.                 CREATE <UNIQUE> INDEX index_name ON column_name; *unique可选;
  3. QUIT;
  4.         注:删除索引用DROP INDEX;
复制代码


三、使用索引合并数据集
以下数据集1和2用作后续步骤的datasource.
数据集1: SCORE
  1. DATA score;
  2.     input ID $ SCORES;
  3.     DATALINES;
  4.     1   80
  5.     2   85
  6.     3   60
  7.     4   75
  8.     5   90
  9.     6   99
  10.     ;
  11. RUN;
复制代码


数据集2: AGES
  1. DATA AGES;
  2.     INPUT ID $ AGE;
  3.     DATALINES;
  4.     2   18
  5.     3   19
  6.     4   16
  7.     7   20
  8.     8   19
  9.     9   15
  10.     ;
  11. RUN;
复制代码


创建索引:
  1. DATA SCORE(INDEX = (ID));SET  SCORE;RUN;
  2. DATA AGES (INDEX = (ID));SET  AGES;RUN;
复制代码


交集:
  1. data S_AND_A;
  2.     SET SCORE;
  3.     _ERROR_ = 0;
  4.     SET AGES KEY = ID/UNIQUE;
  5.     IF _IORC_ = 0;
  6. RUN;
复制代码


只包含SCORE:
  1. DATA SCORE_ONLY;
  2.        SET SCORE;
  3.        _ERROR_ =0;
  4.        SET AGES KEY = ID/UNIQUE;
  5.        IF _IORC_ NE 0 THEN AGE=0;
  6.    RUN;
复制代码


只包含SCORE 中不属于AGE的ID记录:
  1. DATA S_NOTIN_A;
  2.     SET SCORE;
  3.     _ERROR_ = 0;
  4.     SET AGES KEY = ID/UNIQUE;
  5.     IF _IORC_ NE 0;
  6.     AGE = 0;
  7. RUN;
复制代码


只包含AGES中不属于SCORE的ID记录:
  1. DATA A_NOTIN_S;
  2.     SET AGES;
  3.     _ERROR_ = 0;
  4.     SET SCORE KEY = ID/UNIQUE;
  5.     IF _IORC_ NE 0;
  6.     SCORES = 0;
  7.    RUN;
复制代码


并集:
  1. DATA SOA; SET SCORE(KEEP = ID) AGES(KEEP = ID);RUN;
  2. PROC SORT DATA =SOA NODUPKEY; BY ID;RUN;

  3. DATA SORA;
  4.     SET SOA;
  5.     _ERROR_ =0;
  6.         SET SCORE KEY=ID/UNIQUE;
  7.         IF _IORC_ NE 0 THEN SCORES = 0;
  8.     _ERROR_ =0;
  9.         SET AGES KEY = ID/UNIQUE;
  10.         IF _IORC_ NE 0 THEN AGE = 0;
  11. RUN;
复制代码


*note:
1:ERROR is reset to 0 to prevent an error condition that would write the contents of the PDV to the SAS log.
2: IORC is a automatic variable(program data vector PDV),it’s used with INDEXed dataset to check whether the direct read found a matching observation,for matched observation IORC =0; otherwise IORC NE 0;
3:不能在一个data步内同时创建和使用索引;
4:当原数据集被覆盖时,原索引丢失,如需使用需新建索引;
5:使用length 语句,防止字符串被截断*
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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

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

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

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

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