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

一、概述

在合并数据集的时候,可以使用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 页面生成错误信息。(故推荐用显式索引)。

简单索引:

DATA  score(INDEX=(student_id));
    SET test;
RUN;

也可以同时创建多个简单索引:

DATA  score(INDEX=(student_id class));
    SET test;
RUN;

复杂索引:

DATA  score (INDEX = (INDEX_NAME = (ID CLASS))/UNIQUE);
    SET test;
RUN; *INDEX_NAME  是创建的复杂索引的名字。
2、PROC DATASETS 步创建索引(为已存在的sas数据集创建索引,执行时间快,因为只读取KEY VALUE)
PROC DATASETS  LIBRARY=;
	MODIFY data_set_name;
	INDEX CREATE var/UNIQUE	NOMISS; *var是创建索引的key value;
	INDEX CREATE index_name=(var1 var2)/UNIQUE;
QUIT;

注:在PROC DATASET 中删除索引用INDEX DELETE;
3、在PROC SQL 中创建索引;
PROC SQL ;
		CREATE  INDEX index_name ON column_name; *unique可选;
QUIT;
	注:删除索引用DROP INDEX;

三、使用索引合并数据集

以下数据集1和2用作后续步骤的datasource.
数据集1: SCORE

 DATA score;
    input ID $ SCORES;
    DATALINES;
    1   80
    2   85
    3   60
    4   75
    5   90
    6   99
    ;
 RUN;

数据集2: AGES

 DATA AGES;
    INPUT ID $ AGE;
    DATALINES;
    2   18
    3   19
    4   16
    7   20
    8   19
    9   15
    ;
RUN;

创建索引:

DATA SCORE(INDEX = (ID));SET  SCORE;RUN;
DATA AGES (INDEX = (ID));SET  AGES;RUN;

交集:

data S_AND_A;
    SET SCORE;
    _ERROR_ = 0;
    SET AGES KEY = ID/UNIQUE;
    IF _IORC_ = 0;
RUN;

只包含SCORE:

  DATA SCORE_ONLY;
       SET SCORE;
       _ERROR_ =0;
       SET AGES KEY = ID/UNIQUE;
       IF _IORC_ NE 0 THEN AGE=0;
   RUN;

只包含AGES:

  DATA AGES_ONLY;
       SET AGES;
       _ERROR_ =0;
       SET SCORE KEY = ID/UNIQUE;
       IF _IORC_ NE 0 THEN SCORES=0;
   RUN;    

只包含SCORE 中不属于AGE的ID记录:

DATA S_NOTIN_A;
    SET SCORE;
    _ERROR_ = 0;
    SET AGES KEY = ID/UNIQUE;
    IF _IORC_ NE 0;
    AGE = 0;
RUN;

只包含AGES中不属于SCORE的ID记录:

  DATA A_NOTIN_S;
    SET AGES;
    _ERROR_ = 0;
    SET SCORE KEY = ID/UNIQUE;
    IF _IORC_ NE 0;
    SCORES = 0;
   RUN;

并集:

DATA SOA; SET SCORE(KEEP = ID) AGES(KEEP = ID);RUN;
PROC SORT DATA =SOA NODUPKEY; BY ID;RUN;

DATA SORA;
    SET SOA;
    _ERROR_ =0;
        SET SCORE KEY=ID/UNIQUE;
        IF _IORC_ NE 0 THEN SCORES = 0;
    _ERROR_ =0;
        SET AGES KEY = ID/UNIQUE;
        IF _IORC_ NE 0 THEN AGE = 0;
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 语句,防止字符串被截断*

你可能感兴趣的:(SAS,学习笔记,SAS,INDEX,创建索引,合并数据集)