[SAS] 3分鐘學會基本PROC SQL-2

YC Huang
Mar 12, 2024

--

SQL系列上一篇[SAS] 3分鐘學會基本PROC SQL主要介紹如何從「同一個」資料集相互轉換、簡單統計計算。本篇主要介紹SQL另一種強大的功能:資料間的水平合併。

下圖兩個資料集左邊為info,右邊為health,給定每個人一個編號、名字和性別,health則是本次健檢體重的資訊,可以發現的是兩邊資料的資料筆數不同,且人的編號也不盡相同。想像要將兩個資料的資訊合併,第一想法可能想嘗試data step當中的merge,但因為merge key需要先在合併前排序,且兩者資料集合併的merge key變數名稱必須一樣,因此當我們在「沒有排序且變數名稱不同」時,可以直接考慮PROC SQL。

左:info資料集; 右:health資料集

資料集水平合併:left join || right join || full join || inner join

水平合併范恩圖
  • LEFT join以左為主,以上面這個資料集來解釋就是左邊的資料集為第一宣告的info,右邊的第二宣告的資料集health,因此兩者在合併時會以「有在info出現的資料為前提」進行合併。Owen和Nina雖然有出現在info,但因為health並沒有他們任何的資訊,因此health為空。
  • RIGHT join: 以右為主,同理,以上面這段程式碼解釋就是以右邊資料為主(即為第二宣告的health)。在水平合併的規則是「有在health出現的資料為基準」。ID=S006有體重測量值,但因為info沒有他的資料,導致部分資料為空。此時你可能疑問:為什麼ID欄位沒有S006的值?那是因為我們在取用時,宣告我們僅選取info裡面的ID資訊,因此在合併時,即便我們選取以右為準,依然無法顯示ID。
  • FULL join:兩者聯集,表示只要資料有出現在info或者health,最終都會出現在資料集當中。以本篇為例,info共有6筆資料,而health僅有1筆資料沒有包含在info當中,因此兩者合併後一共是7筆
  • INNER join:兩者交集,表示資料必須同時出現在info和health中,在圖一可以看到兩邊有相同ID的資料一共有4筆。
/*SQL*/
data info;
infile datalines delimiter=',';
input ID $ name :$20. sex : $5.;
datalines;
S001, Lisa, F
S002, David, M
S003, Jane, F
S004,Nina, F
S005,Felix, M
S010, Owen, M
;
run;

data health;
infile datalines delimiter=',';
input ID : $20. weight;
datalines;
S001, 55
S002, 80
S003, 75
S005, 83
S006, 45
;
run;

--

--

YC Huang

嗨嗨我是一個喜歡資料視覺化的小小工程師,目前專注於SAS和臨床統計,希望文章能更多關於什麼主題呢?歡迎留言給我