跳到主要內容

Python與SAS資料處理入門-檔案合併(2)



上一篇文章已介紹完列合併的部份,這邊就不再贅述,直接開始介紹欄合併怎麼執行。



SAS進行欄合併(橫向堆疊)
將基本資料中的性別、年齡等資料併入2018年的生活品質調查結果,進行橫向堆疊操作。
欄合併的部分在SAS會有2種常用做法,一個是用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一樣的話就將基本資料串上。

ü    SQL合併 
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;

合併結果顯示在聯集的情況下,如果A檔有ID紀錄但在B檔沒有此ID紀錄,如ID編號為F的資料,從B檔案併入的欄為皆帶missing,反之亦然。


交集(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;

ID同時存在於A檔與B檔的資料予以保留,意謂ID只存在A檔的F以及ID只存在於B檔的E,在取交集的情況下不會保留。


左串連(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套件
            聯集(Full join)
                                       不論可否可以串連,兩個資料的訊息都保留。
                                     將基本資料與2018年的生活品質資料取聯集,這邊用                                                         pandasmerge函數來進行。

import pandas
combined =pandas.merge(id_list, y_2018, how="outer", left_on=['ID'], right_on = ['ID'])
     ²  How參數決定合併條件,outer為取聯集
     ²  left_onright_on參數串聯的鍵值,類似SAS mergeby的概念,
               如果鍵值欄位名稱一樣,那可以直接使用on參數即可。
    ²  SAS稍微不同的地方在於,當合併的檔案欄位名稱一樣的時候不會互相覆蓋,在沒有給定特別條件的情況下,會自動在重覆的欄位名稱後面分別加上_x_y

            合併結果顯示在聯集的情況下,如果A檔有ID紀錄但在B檔沒有此ID紀錄,如ID編號為F的資料,從B檔案併入的欄為皆帶missing,這邊的表示方式為NaN

        交集(Inner join)兩個資料同時都有的情況才保留。
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畫框框)
          A檔案為主做合併,ID不在A檔案裡的資料不予保留。




右串連(Right join): 
 以右邊資料為主,右邊有資料的情況才將左邊的資料串連上   去。
combined =pandas.merge(id_list, y_2018, how="right", left_on=['ID'], right_on = ['ID'])
           (這邊right畫框框)
                 B檔案為主做合併,ID不在B檔案裡的資料不予保留。

        
差集(Different)
以左邊資料為主,但是如果同時有出現在右邊資料的就不要,反之亦然。
  這邊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

留言

這個網誌中的熱門文章

如何快速註冊統合分析題目~以PROSPERO為例

初步檢索心中的愛 當心目中有一個理想題目時,為避免地球上另一個人也同時跟你想的一樣,而且還比我們早發表,若等我們發表時才發現,當下一定很扼腕,有了註冊系統除了幫自己先占好位子,也可以同時確認這個題目是否已經有人正在做了,不用浪費時間投注在上面。很多人其實不曉得實際上到底要如何註冊,以下一起註冊吧。 什麼是 PROSPERO??   PROSPERO (International prospective register of systematic reviews) 是一個國際前瞻性系統性文獻回顧評價系統,由美國國立衛生研究院 NIHR ( National Institute for Health Research )資助,由英國約克大學 CRD(Centre of Reviews and Dissemination) 創立,針對將已完成的評價或正進行中的計畫做紀錄。 目的:避免重複並減少報告偏見的機會,增加透明性。                 步驟流程 Step 1 :檢索主題 先確認其他人是否對這主題感興趣,有人捷足先登了嗎 ?? 也可以確認目前流行的趨勢是哪類型的研究等。 Step 2 :註冊帳號 ID 先到 PROSPERO 官網 ,填寫基本資料後註冊 ID 。 Step 3 :點選註冊文獻 review 要需先有帳號後才能註冊題目,進入頁面後依指示一步一步操作。 以下是網頁步驟,依研究對象是人群還是動物選擇按鈕點選,一般我們都是人群研究,選紫色。同時須確認以下五步驟是否都經過檢驗了。 第 1 步 檢查納入標準。 第 2 步 確保您的 protocol 處於(接近)最終形式。 第 3 步 搜尋 PROSPERO ,以確保評論尚未被註冊。 第 4 步 搜尋 PROSPERO ,以確保您沒有不必要地重複由另一個團隊進行的審核或先前已註冊的審核 第 5 步 開始註冊 Step 4 :點選相關事前準備工作進度。 這裡有一系列問題須皆回答完,才能進行下一步...

python與SAS資料處理-歸人與排除重複

  歸人顧名思義就是將一個人多筆的資料整合,每人只留下 1 筆。   通常取得的資料都是原始資料,並未經過整理。例如手上有疑份顧客購物紀錄,裡面有每個顧客在這 1 年內的每筆消費紀錄,這是一份以每次消費紀錄為 1 筆的紀錄形式,所以一個人可以有多筆的消費紀錄。當我們想要知道這些消費紀錄源自於多少顧客的購買時,這時候就需要用到歸人的概念,將資料轉換為每一個人只有 1 筆資料的紀錄形式 ( 如下圖所示 ) 。 以 SAS 進行資料歸人 歸人留 1 筆消費紀錄 proc sort data =cost; by ID time; run ; /* 在規筆前依照 ID 跟消費日期做排序 */ data cost_1; set cost; by ID; if first.id; run ;   /* 保留第一筆資料 */   之前已經有針對 proc sort 的排序語法進行說明,有需要可參考這篇 文章 , SAS 排序的設定值為升冪,也就是說每個人都會從最早那次的紀錄開始往後排序,所以用 first.id 就可以留下每個人最早那次的消費紀錄。 這邊也可以用排除重複的概念保留 1 筆資料 proc sort data =cost out =cost_2 nodupkey ; BY ID; run ; 利用 nodupkey ,將 ID 重複的資料刪除,僅保留每個 ID 第一次出現的該筆紀錄。   歸人累計所有消費金額 proc sort data =cost; by ID time; run ; data cost_1; set cost; by ID; if first.id then count= 0 ;/* 每個人第一筆資料都令 count=0*/ count+NT;/* 同 ID 累計 NT 數值 */ if last.id; run ;   除了要歸人以外,還要累計每個仁所有的消費金額,所以這邊就會創建一個 count 欄位,每一個人的第一筆 ID 令 count=0 ,在同樣 ID 時累加 NT 的數值,最後每個人保留最後一筆 ID ,也就是最後累計的總額。 以 Python 進行資料歸人...

使用python繪製Upset plot

  Upset plot 將集合視覺化,特別是當集合數大於 5 的時候, Upset plot 相較於 Venn plot 可以更清楚的呈現。 Upset plot 來自於 Venn plot 的變化, Venn plot 較常用於生物資訊呈現 ( 圖 1-3) ,但是往往會遇到集合數太多不易呈現的情況,從下圖可清楚看到當集合數為 4 的時候,畫面已經有些複雜,所以 Venn plot 的缺點就是當集合數過多時,畫面所呈現的資訊反而會造成視覺上的負擔,增加訊息解讀的困難性,失去視覺化的意義 — 方便閱讀,因此當集合數 ≥5 時不建議使用 Venn plot ,而後衍生出 Upset plot 。 Upset plot 優勢在於當集合數 ≥5 時可以清楚呈現資訊,不會造成視覺上的混亂。 2020 年影響全球的 COVID-19 ,在面對未知的流行病時沒有人可以確定真正有效的治療物,因此優先挑出具有高度可能性的藥物,嘗試用於治療病患,在高度不確定性的情況下會產生多種治療組合,這樣的情況就很適合採用 Upset plot 呈現 Real World 用藥資料,這裡有一篇發表於 CANCER DISCOVERY 的文章 ,這是一個很好的實務範例 ( 圖 4) ,以下擷取這篇 paper 的部份數據,簡單的做個 Upset plot 。 操作步驟 1. 選定主題,準備素材 以這篇文章中的數據來畫 Upset plot 圖 。開始執行前,需要先安裝 Upset plot 的套件。在 Window 環境下,開起命令提示字元,輸入 pip install upsetplot ,安裝完成後,就可進入繪圖步驟。   2. 繪製 Upset plot 這邊帶入 paper 中前 10 筆的數據。 from upsetplot import generate_counts from upsetplot import plot from upsetplot import from_memberships example = from_memberships([['Azithromycin','Hydroxychloroquine'], ['Hydroxychloroquine'...