一、一對一合并數(shù)據(jù)集
1.具有不同變量的數(shù)據(jù)集
在橫向合并中,當(dāng)兩個或更多的SAS數(shù)據(jù)集沒有相同的變量時,此時合并數(shù)據(jù)集的變量均會展示在數(shù)據(jù)集中。
data one;
input week $10.;
cards;
Week1
Week2
Week3
Week4
Week5
;
run;
/ 結(jié)果如下: /
data two;
input topic $10.;
cards;
Topic 1
Topic 2
Topic 3
Topic 4
Topic 5
;
run;
/ 結(jié)果如下: /
data all1;
merge one two;
run;
/ 結(jié)果如下: /
2.具有相同變量的數(shù)據(jù)集(不使用by語句)
當(dāng)兩個或更多的SAS數(shù)據(jù)集有相同的變量時,第 2 個數(shù)據(jù)集中的變量將覆蓋第 1 個數(shù)據(jù)集中的相同變量。如果不想要被覆蓋,則可以使用RENAME數(shù)據(jù)步驟選項來重新命名。
data three;
input ID $3. balance 4.;
cards;
001 102
005 89
002 231
004 147
003 192
;
run;
/ 結(jié)果如下: /
data four;
input Name $ 1-15 @17 balance 4.;
cards;
John Smith 96
Ted Husion 80
Martha Chen 150
Sandy Lee 100
Paul Leny 192
Avery 200
;
run;
/ 結(jié)果如下: /
data all2;
merge three four;
run;
/ 結(jié)果如下: /
**3.具有相同變量的數(shù)據(jù)集(使用by語句) **
與by語句的合并允許根據(jù)by變量的值來匹配觀測值。在合并之前,所有的輸入數(shù)據(jù)集必須按照BY或KEY變量進行排序。
data five;
input ID $3. balance 4. zip 6.;
cards;
001 102 16431
005 89 46298
002 231 98704
004 147 42316
003 192 44765
007 479 21496
;
run;
proc sort data=five;
by id;
run;
/ 結(jié)果如下: /
data six;
input Name $ 1-15 @17 balance 4. @23 ID $3.;
cards;
Sandy Lee 100 004
Paul Leny 192 003
John Smith 96 001
Ted Husion 80 005
Martha Chen 150 002
Jason Tod 244 006
;
run;
proc sort data=six;
by id;
run;
/ 結(jié)果如下: /
data all3;
merge five six;
by id;
run;
/ 結(jié)果如下: /
4.具有相同變量的數(shù)據(jù)集(使用by語句和in選項)
在上面的例子中,觀察值6和7來自兩個數(shù)據(jù)集中的一個。IN=選項創(chuàng)建了一個變量,可以識別數(shù)據(jù)集是否對輸出有貢獻。舉以下三個例子來讓大家理解:
例1:在上面的例子中,我們添加了另一個變量 "source",并使用IN=選項來識別每個輸入數(shù)據(jù)集的貢獻:
data all4;
length source $8;
merge five(in=in1) six(in=in2);
by id;
if in1 and in2 then source='Both';
else if in1 then source='Left';
else source='Right';
run;
/ 結(jié)果如下: /
例2:在上面的例子中,如果我們希望輸出的數(shù)據(jù)集只包含來自兩個輸入數(shù)據(jù)集的觀察值:
data all5;
merge five(in=in1) six(in=in2);
by id;
if in1 and in2 ;
run;
/ 結(jié)果如下: /
例3:我們希望輸出的數(shù)據(jù)集包含所有來自five輸入數(shù)據(jù)集的觀測值:
data all6;
merge five(in=in1) six(in=in2);
by id;
if in1 ;
run;
/ 結(jié)果如下: /
注意:如果匹配合并的目的是一對一的匹配合并,輸入的數(shù)據(jù)集應(yīng)該沒有重復(fù)的鍵。因此,在合并之前,可能需要在合并前對proc sort使用NODUPKEY選項。
二、一對多或多對一合并數(shù)據(jù)集
BY變量值在某一輸入數(shù)據(jù)集中存在重復(fù)值,即在其中一個輸入數(shù)據(jù)集中,含有兩條或兩條以上的觀測具有相同的BY變量值,也稱為一對多合并。
在匹配過程中會遵循如下原則:由輸入數(shù)據(jù)集讀入的變量值,會保留在PDV中,直到被下一個讀入的觀測值覆蓋或該BY組合處理完畢被重置為缺失值為止。為了更好的理解,通過一個簡單的例子來具體講解這一原則。
data seven;
input ID $3. zip 6.;
cards;
001 16431
005 46298
002 98704
004 42316
003 44765
007 21496
;
run;
proc sort data=seven out=seven;
by id;
run;
/ 結(jié)果如下: /
data eight;
input Name $ 1-15 @17 balance 4. @23 ID $3.;
cards;
Sandy Lee 100 004
Paul Leny 192 003
John Smith 96 001
Ted Husion 80 005
Martha Chen 150 002
Jason Tod 244 006
Avery 200 001
;
run;
proc sort data=eight out=eight;
by id;
run;
/ 結(jié)果如下: /
data all7;
merge seven eight;
by id;
run;
/ 結(jié)果如下: /
三、多對多合并數(shù)據(jù)集
雖然在匹配合并時,一般情況下BY變量值至多在某一個數(shù)據(jù)集中有重復(fù),但并不代表匹配合并只能處理這一種情況,它同樣可以處理兩個或兩個以上輸入數(shù)據(jù)集中的BY變量值重復(fù)的情況,也就是實現(xiàn)多對多合并。
SAS的匹配原則和一對多合并時一樣,并且新數(shù)據(jù)集中每一個BY變量值重復(fù)的次數(shù)和輸入數(shù)據(jù)集中重復(fù)次數(shù)最多的一樣。
data nine;
input id$3. number;
cards;
001 2
001 3
002 2
002 4
;
run;
proc sort data=nine out=nine;
by id;
run;
/ 結(jié)果如下: /
data ten;
input id$3. balance;
cards;
001 100
001 192
002 150
002 200
003 136
;
run;
proc sort data=ten out=ten;
by id;
run;
/ 結(jié)果如下: /
data all8;
merge nine ten;
by id;
run;
/ 結(jié)果如下: /
在上例中,all8數(shù)據(jù)集中有一部分id號的number信息,如果不想將這些id的信息包含在新生成的數(shù)據(jù)集中,就需要確定數(shù)據(jù)集使用數(shù)據(jù)集選項IN=可以幫助實現(xiàn)這一功能。
data all9;
merge nine(in=in1) ten(in=in2);
by id;
if in1;
run;
/ 結(jié)果如下: /
-
SAS
+關(guān)注
關(guān)注
2文章
523瀏覽量
32860 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1208瀏覽量
24689
發(fā)布評論請先 登錄
相關(guān)推薦
評論