|
一、概述
在合并数据集的时候,可以使用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 <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));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;
复制代码
只包含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 语句,防止字符串被截断* |
|