上一篇文章已介紹完列合併的部份,這邊就不再贅述,直接開始介紹欄合併怎麼執行。
以SAS進行欄合併(橫向堆疊)
將基本資料中的性別、年齡等資料併入2018年的生活品質調查結果,進行橫向堆疊操作。
欄合併的部分在SAS會有2種常用做法,一個是用merge合併,另一個則是用SQL的方式合併,以下分別依序說明。
ü merge合併
ü SQL合併
ü merge合併
這部分務必記得,merge前要先排序(不知道的可以點這)(proc sort)做排序,不
然系統會出現錯誤訊息無法執行。
然系統會出現錯誤訊息無法執行。
proc sort data=id_list;by id;run;
proc sort data=y_2018;by id;run;
data combine_2018;merge y_2018 id_list;by id;run;
透過by告訴程式依照ID做合併,也就是ID一樣的話就將基本資料串上。
透過by告訴程式依照ID做合併,也就是ID一樣的話就將基本資料串上。
proc sql;create table
combine_2018 /*新創建的表格名稱*/
as select a.*,b.* /*選擇表格所需的欄位,a.*表示選擇a的所有欄位*/
from
y_2018 as a full join
id_list as b
on
a.id=b.id; /*合併的方式,與merge中的by同樣意思*/
quit;
SQL的語法有些不同,一開始可能會有些不太習慣,不過SQL合併的好處是檔案不需先排序,可直接進行DataFrame合併。
ü 進階整理
實務上可能會遇到存在於A檔的人,B檔卻沒有記錄的情況,當要併檔的資料不見得一致時就必須要指定以哪個檔案為主作欄位合併,因此在基礎概念後帶入更進階的觀念「主從關係」。
此外,使用SAS合併欄位的時候要注意併檔的資料間是否有相同的欄位名稱,以免欄位覆蓋。如果有重複的欄位名稱merge語法會以後面重複的欄位覆蓋前面的欄位,sql則是前蓋後,也就是以前面的欄位為主,後面重複的欄位就會被忽略。
聯集(Full join):
不論可否可以串連,兩個資料的訊息都保留。
將基本資料與2018年的生活品質資料取聯集。
/*使用merge*/
proc sort data= id_list;by id;run;
proc sort data= y_2018;by id;run;
data combine;merge id_list y_2018;by id;run;
/*使用sql full join*/
proc sql;create table combine1 as select* from id_list as a full join y_2018 as b on a.id=b.id;quit;
交集(Inner join):
兩個資料同時都有的情況才保留。
/*使用merge*/
proc sort data= id_list;by id;run;
proc sort data= y_2018;by id;run;
data combine;merge id_list(in=a) y_2018(in=b);by id;
if a & b;run; /*用if條件判斷留下兩個檔案的交集*/
/*使用sql inner join*/
proc sql;create table combine as select* from id_list as a inner join y_2018 as b on a.id=b.id;quit;
左串連(Left join):以左邊資料為主,左邊有資料的情況才將右邊的資料串連上去。
/*使用merge*/
proc sort data= id_list;by id;run;
proc sort data= y_2018;by id;run;
data combine;merge id_list(in=a) y_2018;by id;
if a ; /*用if條件判斷以A檔為主做合併*/
run;
/*使用sql left join*/
proc sql;create table combine as select* from id_list as a left join y_2018 as b on a.id=b.id;quit;
以A檔案為主做合併,ID不在A檔案裡的資料不予保留。
右串連(Right join):以右邊資料為主,右邊有資料的情況才將左邊的資料串連上去。
/*使用merge*/
proc sort data= id_list;by id;run;
proc sort data= y_2018;by id;run;
data combine;merge id_list y_2018(in=b);by id;
if b ; /*用if條件判斷以B檔為主做合併*/
run;
/*使用sql right join*/
proc sql;create table combine as select* from id_list as a right join y_2018 as b on a.id=b.id;quit;
以B檔案為主做合併,ID不在B檔案裡的資料不予保留。
差集(Different):
以左邊資料為主,但是如果同時有出現在右邊資料的就不要,反之亦然。
/*使用merge*/
proc sort data= id_list;by id;run;
proc sort data= y_2018;by id;run;
data combine;merge id_list y_2018(in=b);by id;
if a & not b ;/*存在於A檔卻不在B檔案裏面的資料*/
run;
/*使用sql */
proc sql;create table combine as select* from id_list as a left join y_2018 as b on a.id=b.id where b.id is null;quit;
透過邏輯判斷留下ID編號在在基本資料檔案中卻不曾出現在2018年的生活品質調查中的F。
|
以Python進行欄合併(橫向堆疊)
合併基本資料檔與2018年的生活品質調查結果,這邊同樣會使用pandas套件。
不論可否可以串連,兩個資料的訊息都保留。
將基本資料與2018年的生活品質資料取聯集,這邊用 pandas的merge函數來進行。
import pandas combined =pandas.merge(id_list, y_2018, how="outer", left_on=['ID'], right_on = ['ID'])
² How參數:決定合併條件,outer為取聯集
² left_on跟right_on參數:串聯的鍵值,類似SAS merge中by的概念,
如果鍵值欄位名稱一樣,那可以直接使用on參數即可。
² 跟SAS稍微不同的地方在於,當合併的檔案欄位名稱一樣的時候不會互相覆蓋,在沒有給定特別條件的情況下,會自動在重覆的欄位名稱後面分別加上_x跟_y。
合併結果顯示在聯集的情況下,如果A檔有ID紀錄但在B檔沒有此ID紀錄,如ID編號為F的資料,從B檔案併入的欄為皆帶missing,這邊的表示方式為NaN。
combined =pandas.merge(id_list, y_2018, how="inner", left_on=['ID'], right_on = ['ID'])
(這邊inner畫框框)
ID同時存在於A檔與B檔的資料予以保留,ID只存在A檔的F以及ID只 存在於B檔的E,取交集的情況下不保留。左串連(Left join):
以左邊資料為主,左邊有資料的情況才將右邊的資料串連上 去。
combined =pandas.merge(id_list, y_2018, how="left", left_on=['ID'], right_on = ['ID'])
(這邊left畫框框)
右串連(Right join):
以右邊資料為主,右邊有資料的情況才將左邊的資料串連上 去。
combined =pandas.merge(id_list, y_2018, how="right", left_on=['ID'], right_on = ['ID'])(這邊right畫框框)
以B檔案為主做合併,ID不在B檔案裡的資料不予保留。
這邊pandas也是有辦法處理 。
combined =pandas.merge(id_list, y_2018, how="outer", on=['ID'], indicator=True) combined=combined[combined['_merge']=='left_only']
² indicator參數: indicator=True納在合併時,會增加一個欄位_merge,如 果兩邊同時存在會coding “both”,只有左邊有coding
”left_only”,只有右邊存在coding “right_only”,透過這個欄位可以進行後續處理,找出差集的部分。
透過邏輯判斷留下ID編號在在基本資料檔案中卻不曾出現在2018年的生
活品質調查中的F。
留言
張貼留言