1. merge横向精确合并
一般来说,用到stata进行数据合并,都应该是用1:1合并,这才能一一对应,所以,非一一对应的合并我就不说了。免得混乱。
一般来说,善用生成的 _merge 变量来删除不要的匹配,再加上知道下面的几种情况怎么匹配,基本上已经够用了。
(merge的用于匹配的变量格式必须一致,格式不一致的请参照命令help recast)
首先分析一下,用什么指标能唯一地识别出一个数据?显然,对应上面这个面板数据,用year和id两个指标,就能唯一的指明某一条数据。所以我们应用year和id这个组合来进行匹配。
然后,选择其中一个数据集合作为原本的数据集合。另一个数据集合就用来匹配,匹配成功后就加进原来数据集里面。
所以,上述的操作代码为:
//加载数据集1.dta use "C:UsersAdministratorDesktop1.dta" //根据year id两个维度来匹配数据 merge 1:1 year id using "C:UsersAdministratorDesktop2.dta"
互补的数据,你有我没有,我有你没有,我们只需要非空值。
要合并这个方法很简单,加一个update选项就可以了。update的意思是,如果原来的数据集合该数据为空,那么就使用匹配数据集里面的非空数据替换掉空数据。
//加载数据集1.dta use "C:UsersAdministratorDesktop1.dta" //根据year id两个维度来匹配数据 merge 1:1 year id using "C:UsersAdministratorDesktop2.dta",update
数据集1和数据集2的 var3 变量里面,有一部分是重叠的如果你想要原数据集(也就是数据集1)作为正确的数据,也就是这个:
//加载数据集1.dta use "C:UsersAdministratorDesktop1.dta" //根据year id两个维度来匹配数据 merge 1:1 year id using "C:UsersAdministratorDesktop2.dta",update
但是如果你认为匹配数据集(也就是数据集2)的数据才是正确的,也就是这样:
//加载数据集1.dta use "C:UsersAdministratorDesktop1.dta" //根据year id两个维度来匹配数据 merge 1:1 year id using "C:UsersAdministratorDesktop2.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