1.句法規(guī)則
MERGE SAS-data-set-1 <(data-set-options)>SAS-data-set-2 <(data-set-options) ><...SAS-data-set-n <(data-set-options)> ><END=variable>;
2.詳情
2.1概述
MERGE 語句很靈活济似,在 SAS 編程中有多種用途萌衬。 本節(jié)介紹 MERGE 的基本用法。 其他應(yīng)用包括使用多個 BY 變量反粥、合并兩個以上的數(shù)據(jù)集崎淳,以及將一些觀察結(jié)果與另一個數(shù)據(jù)集中的所有觀察結(jié)果合并削锰。
2.2將數(shù)據(jù)集列表與 MERGE 結(jié)合使用
您可以在 MERGE 語句中使用數(shù)據(jù)集列表。 數(shù)據(jù)集列表提供了一種快速引用現(xiàn)有數(shù)據(jù)集組的方法官辈。 這些數(shù)據(jù)集列表必須是名稱前綴列表或編號范圍列表翘瓮。
名稱前綴列表是指以指定字符串開頭的所有數(shù)據(jù)集贮折。 例如,合并 SALES1:; 告訴 SAS 合并所有以“SALES1”開頭的數(shù)據(jù)集资盅,例如 SALES1调榄、SALES10、SALES11 和 SALES12呵扛。
編號范圍列表要求您擁有一系列同名的數(shù)據(jù)集每庆,但最后一個或多個字符是連續(xù)數(shù)字。 在編號范圍列表中择份,您可以以任何數(shù)字開頭并以任何數(shù)字結(jié)尾扣孟。 例如,這些列表引用了相同的數(shù)據(jù)集:
sales1 sales2 sales3 sales4
sales1-sales4
注意:如果第一個數(shù)據(jù)集名稱的數(shù)字后綴包含前導(dǎo)零荣赶,則最后一個數(shù)據(jù)集名稱的數(shù)字后綴的位數(shù)必須大于或等于第一個數(shù)據(jù)集名稱的位數(shù)凤价。 否則,會發(fā)生錯誤拔创。 例如利诺,數(shù)據(jù)集列出 sales001–sales99 和 sales01–sales9 會導(dǎo)致錯誤。 數(shù)據(jù)集列表 sales001–sales999 有效剩燥。 如果第一個數(shù)據(jù)集名稱的數(shù)字后綴不包含前導(dǎo)零慢逾,則第一個和最后一個數(shù)據(jù)集名稱的數(shù)字后綴中的位數(shù)不必相等。 例如灭红,數(shù)據(jù)集列表 sales1–sales999 是有效的侣滩。
使用編號數(shù)據(jù)集列表時要考慮的其他一些規(guī)則如下:
您可以指定范圍組。
merge cost1-cost4 cost11-cost14 cost21-cost24;
您可以將編號范圍列表與名稱前綴列表混合使用变擒。
merge cost1-cost4 cost2: cost33-37;
您可以將單個數(shù)據(jù)集與數(shù)據(jù)集列表混合使用君珠。
merge cost1 cost10-cost20 cost30;
數(shù)據(jù)集列表周圍的引號將被忽略。
/* 這兩行是一樣的 */
merge sales1-sales4;
merge 'sales1'n-'sales4'n;
數(shù)據(jù)集名稱中的空格無效娇斑。如果使用引號策添,則忽略尾隨空格。
/* 這些語句中的空格會導(dǎo)致錯誤 /
merge sales 1-sales 4;
merge 'sales 1'n - 'sales 4'n;
/ 此語句中的尾隨空格將被忽略 */
merge 'sales1'n - 'sales4'n;
最大數(shù)字后綴為 2147483647毫缆。
/* 這個后綴會導(dǎo)致錯誤 */
merge prod2000000000-prod2934850239;
不允許使用物理路徑名唯竹。
/* 物理路徑名會導(dǎo)致錯誤 */
%let work_path = %sysfunc(pathname(WORK));
merge "&work_path\dept.sas7bdat"-"&work_path\emp.sas7bdat" ;
2.3一對一合并
一對一合并將來自兩個或多個 SAS 數(shù)據(jù)集的觀測值組合成新數(shù)據(jù)集中的單個觀測值。要執(zhí)行一對一合并苦丁,請使用不帶 BY 語句的 MERGE 語句浸颓。 SAS 將 MERGE 語句中命名的所有數(shù)據(jù)集中的第一個觀測值合并到新數(shù)據(jù)集中的第一個觀測值中,將所有數(shù)據(jù)集中的第二個觀測值合并到新數(shù)據(jù)集中的第二個觀測值中,依此類推猾愿。在一對一合并中鹦聪,新數(shù)據(jù)集中的觀察數(shù)量等于 MERGE 語句中指定的最大數(shù)據(jù)集中的觀察數(shù)量账阻。有關(guān)一對一合并的示例蒂秘,請參見示例 1。有關(guān)詳細(xì)信息淘太,請參閱 SAS 語言參考:概念中的讀取姻僧、組合和修改 SAS 數(shù)據(jù)集。
警告
將數(shù)據(jù)集與一對一合并合并時要小心蒲牧。一對一合并有時會產(chǎn)生不良結(jié)果撇贺。在使用此方法之前,在數(shù)據(jù)集的代表性樣本上測試您的程序冰抢。
2.4匹配合并
匹配合并根據(jù)公共變量的值將來自兩個或多個 SAS 數(shù)據(jù)集的觀測值合并為新數(shù)據(jù)集中的單個觀測值松嘶。新數(shù)據(jù)集中的觀察數(shù)是所有數(shù)據(jù)集中每個BY組中最大的觀察數(shù)之和。要執(zhí)行匹配合并挎扰,請在 MERGE 語句之后立即使用 BY 語句翠订。 BY 語句中的變量必須對所有數(shù)據(jù)集通用。在 DATA 步中遵倦,每個 MERGE 語句只能伴隨一個 BY 語句尽超。 MERGE 語句中列出的數(shù)據(jù)集必須按 BY 語句中列出的變量值的順序排序,或者它們必須具有適當(dāng)?shù)乃饕嗵伞S嘘P(guān)匹配合并的示例似谁,請參見示例 2。有關(guān)詳細(xì)信息掠哥,請參閱 SAS 語言參考:概念中的讀取巩踏、組合和修改 SAS 數(shù)據(jù)集。
注意:
MERGE 語句不會在多對多匹配合并中生成笛卡爾積续搀。相反塞琼,它執(zhí)行一對一合并,同時在 BY 組中至少有一個數(shù)據(jù)集中有觀測值目代。當(dāng) BY 組中的所有觀測值都已從一個數(shù)據(jù)集中讀取屈梁,而另一個數(shù)據(jù)集中還有更多觀測值時,SAS 將執(zhí)行一對多合并榛了,直到讀取了所有 BY 組觀測值在讶。
3.比較
- MERGE 結(jié)合了來自兩個或多個 SAS 數(shù)據(jù)集的觀察結(jié)果。 UPDATE 結(jié)合了來自兩個 SAS 數(shù)據(jù)集的觀察結(jié)果霜大。 UPDATE 也會更改或更新主數(shù)據(jù)集中選定觀測值的值构哺。 UPDATE 也可能會添加觀察結(jié)果。
- 與 UPDATE 一樣,MODIFY 通過更改或更新主數(shù)據(jù)集中選定觀測值的值來組合來自兩個 SAS 數(shù)據(jù)集的觀測值曙强。
- 使用兩個或多個 SET 語句讀取觀察值獲得的結(jié)果與使用不使用 BY 語句的 MERGE 語句獲得的結(jié)果相似残拐。但是,對于 SET 語句碟嘴,如果觀察的數(shù)量不相等溪食,SAS 會在從所有數(shù)據(jù)集中讀取所有觀察之前停止處理。相反娜扇,SAS 繼續(xù)處理在 MERGE 語句中命名的所有數(shù)據(jù)集中的所有觀測值错沃。
4.舉例:
/SAS HELP上的官方示例/
/Example 1: One-to-One Merging/
*定義:
一對一合并數(shù)據(jù)將多個輸入數(shù)據(jù)集中的行合并為新輸出數(shù)據(jù)集中的一行。
行根據(jù)它們在輸入數(shù)據(jù)集中的位置進(jìn)行組合雀瓢。
第一個輸入數(shù)據(jù)集中的第一行與第二個輸入數(shù)據(jù)集中的第一行合并枢析,依此類推。;
data data1;
input x $ @@;
datalines;
x1 x2 x3
;
run;
data data2;
input y $ @@;
datalines;
y1 y2 y3 y4 y5 y6
;
run;
data combined;
merge data1 data2;
run;
/Example 2: Match-Merging/
/定義: 匹配合并基于 BY 變量的值將來自兩個或多個輸入數(shù)據(jù)集的行合并到輸出數(shù)據(jù)集中的單個行中刃麸。/
data data1;
input year x $ @@;
datalines;
2011 x1 2012 x2 2013 x3 2014 x4 2015 x5
;
run;
data data2;
input year y $ @@;
datalines;
2011 y1 2012 y2 2013 y3 2014 y4 2015 y5
;
run;
data combined;
merge data1 data2;
by year;
run;
/Example 3: Merging with a Data Set List/
data d008; job=3; emp=19; run;
data d009; job=3; sal=50; run;
data d010; job=4; emp=97; run;
data d011; job=4; sal=15; run;
data comb;
merge d008-d011;
by job;
run;
proc print data=comb;
run;
/Example 4: Three Table Merge with BY Values and the IN= Data Set Option/
DATA CAFE(KEEP=NAME PLACE CNUM);
INPUT NAME $ @@;
PLACE = 'CAFE ';
CNUM = 'C' || LEFT(PUT(N,2.));
DATALINES;
ANDERSON COOPER DIXON FREDERIC FREDERIC PALMER
RANDALL RANDALL SMITH SMITH SMITH
;
RUN;
DATA VENDING (KEEP=NAME PLACE VNUM);
INPUT NAME $ @@;
PLACE = 'VENDING ';
VNUM = 'V' || LEFT(PUT(N,2.));
DATALINES;
CARTER DANIELS GARY GARY HODGE PALMER RANDALL RANDALL
SMITH SMITH SPENCER SPENCER SPENCER SPENCER
;
RUN;
DATA SNACK (KEEP=NAME PLACE SNUM);
INPUT NAME $ @@;
PLACE = 'SNACK ';
SNUM = 'S' || LEFT(PUT(N,2.));
DATALINES;
BARRETT COOPER DANIELS DIXON DIXON FREDERIC GARY HODGE
HODGE PALMER RANDALL RANDALL SMITH SMITH SMITH SMITH
SPENCER SPENCER
;
RUN;
DATA ALL;
MERGE CAFE(IN=CAFEIN) SNACK(IN=SNACKIN) VENDING(IN=VENDIN);
BY NAME;
CIN=CAFEIN; SIN=SNACKIN; VIN=VENDIN;
RUN;
PROC PRINT;
TITLE 'MERGED DATA';
RUN;
/Example 5: Two Table Merge with a BY Variable and the IN= Data Set Option/
data have_a;
input ID amount_a;
datalines;
1 10
3 15
4 20
7 15
9 12
10 14
;
run;
data have_b;
input ID amount_b;
datalines;
2 15
3 20
4 10
5 12
7 20
8 15
9 10
11 20
;
run;
data want;
merge have_a(in=inA) have_b(in=inB);
by id;
length joinType $ 2;
joinType = cats(inA, inB);
run;
proc print data=want;
run;
quit;