一、一對一合并數據集
1.具有不同變量的數據集
在橫向合并中,當兩個或更多的SAS數據集沒有相同的變量時,此時合并數據集的變量均會展示在數據集中。
data one;
input week $10.;
cards;
Week1
Week2
Week3
Week4
Week5
;
run;
/ 結果如下: /
data two;
input topic $10.;
cards;
Topic 1
Topic 2
Topic 3
Topic 4
Topic 5
;
run;
/ 結果如下: /
data all1;
merge one two;
run;
/ 結果如下: /
2.具有相同變量的數據集(不使用by語句)
當兩個或更多的SAS數據集有相同的變量時,第 2 個數據集中的變量將覆蓋第 1 個數據集中的相同變量。如果不想要被覆蓋,則可以使用RENAME數據步驟選項來重新命名。
data three;
input ID $3. balance 4.;
cards;
001 102
005 89
002 231
004 147
003 192
;
run;
/ 結果如下: /
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;
/ 結果如下: /
data all2;
merge three four;
run;
/ 結果如下: /
**3.具有相同變量的數據集(使用by語句) **
與by語句的合并允許根據by變量的值來匹配觀測值。在合并之前,所有的輸入數據集必須按照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;
/ 結果如下: /
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;
/ 結果如下: /
data all3;
merge five six;
by id;
run;
/ 結果如下: /
4.具有相同變量的數據集(使用by語句和in選項)
在上面的例子中,觀察值6和7來自兩個數據集中的一個。IN=選項創建了一個變量,可以識別數據集是否對輸出有貢獻。舉以下三個例子來讓大家理解:
例1:在上面的例子中,我們添加了另一個變量 "source",并使用IN=選項來識別每個輸入數據集的貢獻:
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;
/ 結果如下: /
例2:在上面的例子中,如果我們希望輸出的數據集只包含來自兩個輸入數據集的觀察值:
data all5;
merge five(in=in1) six(in=in2);
by id;
if in1 and in2 ;
run;
/ 結果如下: /
例3:我們希望輸出的數據集包含所有來自five輸入數據集的觀測值:
data all6;
merge five(in=in1) six(in=in2);
by id;
if in1 ;
run;
/ 結果如下: /
注意:如果匹配合并的目的是一對一的匹配合并,輸入的數據集應該沒有重復的鍵。因此,在合并之前,可能需要在合并前對proc sort使用NODUPKEY選項。
二、一對多或多對一合并數據集
BY變量值在某一輸入數據集中存在重復值,即在其中一個輸入數據集中,含有兩條或兩條以上的觀測具有相同的BY變量值,也稱為一對多合并。
在匹配過程中會遵循如下原則:由輸入數據集讀入的變量值,會保留在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;
/ 結果如下: /
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;
/ 結果如下: /
data all7;
merge seven eight;
by id;
run;
/ 結果如下: /
三、多對多合并數據集
雖然在匹配合并時,一般情況下BY變量值至多在某一個數據集中有重復,但并不代表匹配合并只能處理這一種情況,它同樣可以處理兩個或兩個以上輸入數據集中的BY變量值重復的情況,也就是實現多對多合并。
SAS的匹配原則和一對多合并時一樣,并且新數據集中每一個BY變量值重復的次數和輸入數據集中重復次數最多的一樣。
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;
/ 結果如下: /
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;
/ 結果如下: /
data all8;
merge nine ten;
by id;
run;
/ 結果如下: /
在上例中,all8數據集中有一部分id號的number信息,如果不想將這些id的信息包含在新生成的數據集中,就需要確定數據集使用數據集選項IN=可以幫助實現這一功能。
data all9;
merge nine(in=in1) ten(in=in2);
by id;
if in1;
run;
/ 結果如下: /
-
SAS
+關注
關注
2文章
524瀏覽量
32958 -
數據集
+關注
關注
4文章
1209瀏覽量
24850
發布評論請先 登錄
相關推薦
SAS走進企業級存儲應用
串行連接SCSI(SAS)技術開辟寬數據路徑
SAS分區規范為所有SAS物理結構提供靈活高效的接入控制,其特性包括
SAS固態硬盤存儲技術
SAS硬盤有什么特點?
SAS接口的設計
一種大數據的密度統計合并算法
5個必須知道的Pandas數據合并技巧
Yonghong Desktop端Excel 數據集的優化
![Yonghong Desktop端Excel <b class='flag-5'>數據</b><b class='flag-5'>集</b>的優化](https://file1.elecfans.com/web2/M00/A3/8C/wKgaomT6kJ-AHNfxAABPxdMAhGs936.png)
評論