1. merge橫向精確合並
一般來說,用到stata進行數據合並,都應該是用1:1合並,這才能一一對應,所以,非一一對應的合並我就不說了。免得混亂。
一般來說,善用生成的 _merge 變量來刪除不要的匹配,再加上知道下面的幾種情況怎么匹配,基本上已經夠用了。
(merge的用於匹配的變量格式必須一致,格式不一致的請參照命令help recast)
首先分析一下,用什么指標能唯一地識別出一個數據?顯然,對應上面這個面板數據,用year和id兩個指標,就能唯一的指明某一條數據。所以我們應用year和id這個組合來進行匹配。
然后,選擇其中一個數據集合作為原本的數據集合。另一個數據集合就用來匹配,匹配成功后就加進原來數據集里面。
所以,上述的操作代碼為:
//加載數據集1.dta use "C:\Users\Administrator\Desktop\1.dta" //根據year id兩個維度來匹配數據 merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta"
互補的數據,你有我沒有,我有你沒有,我們只需要非空值。
要合並這個方法很簡單,加一個update選項就可以了。update的意思是,如果原來的數據集合該數據為空,那么就使用匹配數據集里面的非空數據替換掉空數據。
//加載數據集1.dta use "C:\Users\Administrator\Desktop\1.dta" //根據year id兩個維度來匹配數據 merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update
數據集1和數據集2的 var3 變量里面,有一部分是重疊的如果你想要原數據集(也就是數據集1)作為正確的數據,也就是這個:
//加載數據集1.dta use "C:\Users\Administrator\Desktop\1.dta" //根據year id兩個維度來匹配數據 merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update
但是如果你認為匹配數據集(也就是數據集2)的數據才是正確的,也就是這樣:
//加載數據集1.dta use "C:\Users\Administrator\Desktop\1.dta" //根據year id兩個維度來匹配數據 merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update replace
merge 需要注意的事項:
m:1 表示keyword在using文件中必須是唯一沒有重復的的
1:m 表示keywords在master文件中必須是唯一沒有重復的
在merge的過程中有可能會出現報錯,說year id對應的選項不唯一。可以用以下代碼去保證數據的唯一
use "number_all.dta",clear sort stkcd year by stkcd year: gen set=_n keep if set==1 drop set
merge完之后結果窗口會出現下列信息,同時表格中會出現一個新的變量_merge,
當_merge為1時,該數據僅在主數據集中存在;
當_merge為2的時候,該數據僅在用於匹配的數據集中出現;
當_merge為3的時候才表示匹配成功,數據在兩個數據集中同時存在。
接着我們可以直接keep if _merge==3,則可以保留匹配成功的數據,刪除匹配不成功的數據。
如果我們需要進行多次merge,不要忘記將_merge變量刪除。drop _merge就可以實現。
2. reclink字符串的模糊合並
use "baseinfo.dta",clear gen id1=_n save "baseinfo.dta",replace use "iv.dta",clear gen id2=_n save "iv.dta",replace use "baseinfo.dta",clear reclink province using "iv.dta", idmaster(id1) idusing(id2) gen(matchscore) list, clean noobs drop _merge id1 id2 save "baseinfo.dta",replace
reclink
命令注意事項:
- 兩份數據中 id 名必須不同。如,在上述命令中
idmaster(id1)
、idusing(id2)
分別代表 master data 中的 id 和 using data 中的 id,結果第五列和第七列解讀為 master data中的id1 = 1 和 using data 中的 id2 = 1 匹配成功; - _merge 變量含義與前文類似;
reclink
命令可解決的匹配問題:大小寫不同、部分字母缺漏或增加、以及順序顛倒;- matchscore 變量為匹配分數,分數越高代表匹配效果越好
- 另外,
reclink
命令還允許對匹配變量設定不同權重。比如,在這個例子中,我們認為 city 是最重要的,則僅需增加vmatch()
選項設定權重。具體示例如下:use file1.dta,clear reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore) wmatch(1 15) list, clean noobs