一、概述
在合並數據集的時候,可以使用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;
1
2
3
也可以同時創建多個簡單索引:
DATA score(INDEX=(student_id class));
SET test;
RUN;
1
2
3
復雜索引:
DATA score (INDEX = (INDEX_NAME = (ID CLASS))/UNIQUE);
SET test;
RUN; *INDEX_NAME 是創建的復雜索引的名字。
1
2
3
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;
1
2
3
4
5
6
7
3、在PROC SQL 中創建索引;
PROC SQL ;
CREATE <UNIQUE> INDEX index_name ON column_name; *unique可選;
QUIT;
注:刪除索引用DROP INDEX;
1
2
3
4
三、使用索引合並數據集
以下數據集1和2用作后續步驟的datasource.
數據集1: SCORE
DATA score;
input ID $ SCORES;
DATALINES;
1 80
2 85
3 60
4 75
5 90
6 99
;
RUN;
1
2
3
4
5
6
7
8
9
10
11
數據集2: AGES
DATA AGES;
INPUT ID $ AGE;
DATALINES;
2 18
3 19
4 16
7 20
8 19
9 15
;
RUN;
1
2
3
4
5
6
7
8
9
10
11
創建索引:
DATA SCORE(INDEX = (ID));SET SCORE;RUN;
DATA AGES (INDEX = (ID));SET AGES;RUN;
1
2
交集:
data S_AND_A;
SET SCORE;
_ERROR_ = 0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ = 0;
RUN;
1
2
3
4
5
6
只包含SCORE:
DATA SCORE_ONLY;
SET SCORE;
_ERROR_ =0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ NE 0 THEN AGE=0;
RUN;
1
2
3
4
5
6
只包含AGES:
DATA AGES_ONLY;
SET AGES;
_ERROR_ =0;
SET SCORE KEY = ID/UNIQUE;
IF _IORC_ NE 0 THEN SCORES=0;
RUN;
1
2
3
4
5
6
只包含SCORE 中不屬於AGE的ID記錄:
DATA S_NOTIN_A;
SET SCORE;
_ERROR_ = 0;
SET AGES KEY = ID/UNIQUE;
IF _IORC_ NE 0;
AGE = 0;
RUN;
1
2
3
4
5
6
7
只包含AGES中不屬於SCORE的ID記錄:
DATA A_NOTIN_S;
SET AGES;
_ERROR_ = 0;
SET SCORE KEY = ID/UNIQUE;
IF _IORC_ NE 0;
SCORES = 0;
RUN;
1
2
3
4
5
6
7
並集:
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;
1
2
3
4
5
6
7
8
9
10
11
12
*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 語句,防止字符串被截斷*
---------------------