Transcript

Ch5 資料合併

1

Ch5 資料合併

{目錄}

5-1 合併資料

5-1.1 垂直合併

5-1.2 水平合併

1. 1對 1合併

2. 多對 1合併

3. 1對多合併

5-1.3 成對合併

5-2 資料轉換

5-2.1 tabulate/gen: 建立虛擬變數

5-2.2 encode/destring/tostring: 文字字串與數字字串間的轉換

5-2.3 formate: 變數格式設定

5-2.4 substr: 抓取文字字元

1. 若欲擷取的變數原為文字格式。

2. 若欲擷取的變數不是文字格式。

5-2.3日期變數從文字改成數字

5-3 本章指令列表

5-4 本章使用的程式語言

Ch5 資料合併

2

Ch5 資料合併

5-1 合併資料

Stata合併資料的方式,有垂直合併(append)、水平合併(merge)以及成對合併

(joinby)三種,分述如下。

5-1.1 垂直合併

將兩個資料檔按「變數欄位」進行「垂直合併」,若合併時其中有一個資料

檔沒有某一變數,則合併後以“.”呈現。

指令:use emp1,clear (以 emp1作為主資料檔)

append using emp2 (垂直合併 emp2新資料檔)

範例 5.1 append垂直合併

1. 設有 emp1與 emp2兩個資料檔,emp1包含 make, price, mpg, rep78四個變數

共 5筆資料。emp2有 make, mpg, rep78,weight四個變數共 2筆資料。

2. 使用 append指令進行垂直合併。

3. 合併後資料如圖所示,在 emp1與 emp2兩資資料中,相同「變數欄位」的資

料,如: mpg與 rep78,會進行垂直銜接;兩資料中沒有重複的變數,如:price

與 weight,進行垂直銜接時,缺漏的值則以“.”表示。

Ch5 資料合併

3

5-1.2 水平合併

Stata水平合併的方式有三種,分別為:1對 1合併、多對 1合併與 1對多合

併。

範例 5.2 merge水平合併

1. 沿用 emp1與 emp2的資料檔。

A. 1對 1合併

「1對 1合併」指針對某個關鍵變數,要求 Stata依據該變數內的觀察值,

進行水平合併。emp1與 emp2的資料檔為例,若我們指定 make作為關鍵變數,

可以發現,在 make變數中,僅 “Dodge Colt” 是同時存在於 emp1與 emp2兩個

資料檔的觀察值,其他觀察值,都沒有重複出現在 emp1與 emp2兩個資料檔中。

Ch5 資料合併

4

因此,當進行「1對 1合併」時,程式會對準“Dodge Colt”進行水平合併,沒有

出現的觀察值則以“.”表示。合併所使用的關鍵變數不同,合併出來的結果也會

不同。

指令:use emp1,clear (以 emp1作為主資料檔)

Merge 1:1 make using emp2 (1:1水平合併 emp2新資料檔)

此外,當進行水平合併 merge指令時,合併完畢後,Stata會提供_merge的

變數,供使用者了解那些變數有 merge到資料,那些變數沒有 merge到資料。如

圖所示,當_merge=1,表示該觀察值只有合併到主資料檔(emp1),當_merge=2,

表示該觀察值只有合併到新資料檔(emp2),當_merge=3,表示該觀察值完整合併

到 emp1與 emp2資料檔。

B. 多對 1合併

「多對 1合併」指藉由關鍵變數,以主料檔(emp1)的多個變數為基礎,將新

資料檔(emp2)中與主資料相關的變數和並進主資料檔中。

指令:use emp1,clear (以 emp1作為主資料檔)

merge m:1 rep78 using emp2 (m:1水平合併 emp2新資料檔)

例如:

(1)設以 rep78作為關鍵變數。以 emp1作為主資料檔。

(2)合併後,新資料檔(emp2)中的第 1筆觀察值被合併進來,但第二筆觀察值,由

於其 mpg=17並沒有出現在主資料檔中,因此,沒有合併進來。

(3)合併狀態如圖所示。

Ch5 資料合併

5

C. 1對多合併

「1對多合併」的水平合併方式與「多對 1合併」相同,差別在於主資料檔

與新資料檔互換。換言之,以 emp2作為主資料檔,emp1作為新資料檔,進行

水平合併。

指令:use emp2,clear (以 emp2作為主資料檔)

merge 1:m rep78 using emp1 (1:m水平合併 emp1新資料檔)

Ch5 資料合併

6

5-1.3 成對合併

1. 將兩個資料檔的觀察值,依據關鍵變數的分類群組,進行成對連結。

指令:use emp1,clear

joinby rep78 using emp2, unmatched(both)

(成對合併,並保留沒有符合的觀察值)

2. 設以 rep78為關鍵變數。

3. 不理會與主資料檔(emp1)重複的變數,僅將新資料檔(emp2)的 weight變數,

依據 rep78的群組,合併進主資料檔內。

5-2 資料轉換

5-2.1 tabulate/gen: 建立虛擬變數

1. tabulate 指令

指令:tabulate rep78, gen(R)

說明:將 rep78變數依據其觀察值的分群,建立以 R為名稱的變數。由圖可

知,rep78的觀察值可區分為 2、3、5三種,透過 tabulate可建立虛擬變數 R1、

R2、R3,分別定義當 rep78=2、rep78=3、rep78=5時的情況。

Ch5 資料合併

7

2. gen 指令

指令:gen UP=1 if price>=3000 & price<=4000

說明:當觀察值落於 3000<=price<=4000,建立變數 UP=1。

5-2.2 encode/destring/tostring: 文字字串與數字字串間的轉換

encode、destring、tostring皆為針對變數進行文字格式與數字格式進行轉換

的常用指令,說明如下。

Ch5 資料合併

8

範例 5.3 encode\destring\tostring文字字串與數字字串間的轉換

1. encode指令

(1) Stata資料中,變數是否為文字格式,可透過兩個地方進行觀察。一為 Data

Editor中,紅色字體為文字格式。二為[Variable]視窗中,也會標示變數的格

式。以 price為例,[Variable]視窗的 formate標示該變數為 str4,表示其為 4

個字元的文字格式。

(2) encode指令為將文字格式轉換為數字格式,並建立新變數。

指令:encode price, gen(PRI)

說明:將 price轉換為數字格式,並將新的觀察值設為 PRI變數。

Ch5 資料合併

9

2. destring 指令:將文字轉數字格式的指令

指令:destring price, replace

說明:將 price由文字格式轉換為數字格式,並取代原變數。

執行指令前的 price變數為文字格式。

執行指令後的 price變數為數字格式。

Ch5 資料合併

10

3. tostring 指令:將數字轉文字格式的指令

指令:tostring price, replace

說明:將 price由數字格式轉換為文字格式,並取代原變數。

5-2.3 substr: 擷取文字字元

1. 若欲擷取的變數原為文字格式。

指令:gen first4=substr(make,1,4)

說明:針對 make變數,擷取由第一個字元起算,往後 4個字元的數值,並

建立 first4變數。

Ch5 資料合併

11

2. 若欲擷取的變數不是文字格式。

由於 substr指令只能處理文字格式的擷取,因此若想要擷取的變數原本不是

文字格式,則需要在擷取之前先進行格式轉換。

指令:tostring DAY,replace

(將 DAY變數轉為文字格式)

gen month_str=substr(DAY,5,2)

(取 DAY第五個字元起算,往後兩個字元,建立 month_str,此時仍維持文字格式)

gen month_num=real(substr(DAY,5,2))

(取 DAY第五個字元起算,往後兩個字元,建立 month_num,並轉換為數字格式)

Ch5 資料合併

12

5-2.4日期變數從文字改成數字

由於 Stata無法直接讀懂日期,因此須將日期轉換成程式可以理解的格式,

轉換流程如下所示。

指令:use day,clear

(使用 day資料檔)

gen in_year =real(substr(DAY, 1, 4))

(取 DAY第 1個字元起算,往後 4個字元,建立 in_year,並轉換為數字格式)

gen in_month=real(substr(DAY, 5, 2))

(取 DAY第 5個字元起算,往後 2個字元,建立 in_month,並轉換為數字格式)

gen in_day =real(substr(DAY, 7, 2))

(取 DAY第 7個字元起算,往後 2個字元,建立 in_day,並轉換為數字格式)

gen in_date=mdy(in_month, in_day, in_year)

(建立日期變數 in_date)

format in_date %dCY/N/D

(將 in_data日期變數的 format,轉換為常見日期格式)

尚未轉換前的 in_data日期格式的型態,如圖中 in_data所示。

透過 format指令將 in_date轉換成常見的日期格式,修改格式後的 in_data,如圖

所示。

Ch5 資料合併

13

5-3 本章指令列表

本章使用指令如表所示。

指令 說明

append 垂直合併資料

merge 水平合併資料

joinby 成對合併資料

Tabulate, gen(#) 建立虛擬變數

gen 建立變數

encode, gen(#) 文字字串轉換為數字字串並建立新變數

destring, repalce 將原變數由文字字串轉換為數字字串

tostring, repalce 將原變數由數字字串轉換為文字字串

substr 抓取文字字元

real(#) 將(_)內的文字字串轉存成數字格式

Ch5 資料合併

14

5-4 本章使用的程式語言

set memory 200m

cd c:\temp

/* 檢視資料 */

use emp1,clear

list

use emp2,clear

list

/* 垂直合併 */

use emp1,clear

append using emp2

/* 水平合併資料 */

use emp1,clear /* for 1對 1 合併 */

merge 1:1 make using emp2

use emp1,clear /* for 多對 1 合併 */

merge m:1 rep78 using emp2

use emp2,clear /* for 1對多 合併 */

merge 1:m rep78 using emp1

/* 成對合併 */

use emp1

joinby rep78 using emp2, unmatched(both)

/* tabulate/gen: 建立虛擬變數 */

use emp1,clear

tabulate rep78, gen(R)

use emp1,clear

gen UP=1 if price>=3000 & price<=4000

/* encode/destring/tostring: 文字字串與數字字串間的轉換 */

use emp1,clear

encode price, gen(PRI)

keep price

destring price,replace

tostring price,replace

/* substr: 抓取文字字元 */

use emp1,clear

gen first4=substr(make,1,4)

use emp1,clear

tostring DAY,replace

gen month_str=substr(DAY,5,2)

Ch5 資料合併

15

gen month_num=real(substr(DAY,5,2))

/* 日期變數從文字改成數字 */

use day,clear

gen in_year =real(substr(DAY, 1, 4))

gen in_month=real(substr(DAY, 5, 2))

gen in_day =real(substr(DAY, 7, 2))

gen in_date=mdy(in_month, in_day, in_year)

format in_date %dCY/N/D