玩控 发表于 2019-8-15 14:45:41

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 页面生成错误信息。(故推荐用显式索引)。

简单索引:
DATAscore(INDEX=(student_id));
    SET test;
RUN;

也可以同时创建多个简单索引:
DATAscore(INDEX=(student_id class));
    SET test;
RUN;

复杂索引:
DATAscore (INDEX = (INDEX_NAME = (ID CLASS))/UNIQUE);
    SET test;
RUN; *INDEX_NAME是创建的复杂索引的名字。

2、PROC DATASETS 步创建索引(为已存在的sas数据集创建索引,执行时间快,因为只读取KEY VALUE)
PROC DATASETSLIBRARY=;
        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 <UNIQUE> 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));SETSCORE;RUN;
DATA AGES (INDEX = (ID));SETAGES;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;

只包含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 语句,防止字符串被截断*
页: [1]
查看完整版本: SAS创建和使用索引(SAS INDEX)