*输入两份数据
clear
input str13 name str14 city
"Zhang ziye" "Beijing"
"Liu biqian" "Shanghai"
"Hu,yi" "Guangzhou"
"Yang,Zhou" "Hennan"
gen id1=_n
save file1.dta, replace
clear
input str14 name str10 city
"Zhan, ziye" "beijing"
"LIU Biqian" "Shaanghai"
"huyi" "guangdong"
"Zhou yang" "henan"
gen id2=_n
save file2.dta, replace
*-模糊匹配
use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore)
list, clean noobs
模糊匹配后结果:
name Uname city Ucity id1 matchs~e id2 _merge
Zhang ziye Zhan, ziye Beijing beijing 1 0.9719 1 3
Yang,Zhou Zhou yang Hennan henan 4 0.7797 4 3
Liu biqian Shanghai 2 . . 1
Hu,yi Guangzhou 3 . . 1
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
模糊匹配后结果:
name Uname city Ucity id1 matchs~e id2 _merge
Zhang ziye Zhan, ziye Beijing beijing 1 0.9659 1 3
Liu biqian LIU Biqian Shanghai Shaanghai 2 0.9475 2 3
Yang,Zhou Zhou yang Hennan henan 4 0.8129 4 3
Hu,yi Guangzhou 3 . . 1
*输入数据
clear
input group str3 x1
1 "A"
1 "B"
1 "C"
1 "D"
save file1.dta,replace
clear
input group str3 x2
1 "M"
1 "N"
save file2.dta,replace
*merge 多对多匹配
use file1.dta,clear
merge m:m group using file2.dta
list, clean noobs
*joinby 多对多匹配
use file1.dta,clear
joinby group using file2.dta
list, clean noobs
merge 命令多对多匹配结果:
group x1 x2 _merge
1 A M matched (3)
1 B N matched (3)
1 C N matched (3)
1 D N matched (3)
group x1 x2
1 A N
1 A M
1 B M
1 B N
1 C N
1 C M
1 D N
1 D M
可以看出,joinby 命令显然更符合我们的要求。关于 joinby 命令更多详细介绍,请查看帮助文件 help joinby。
5. nearmrg 命令:相似值的匹配
上文已经介绍了字符串模糊匹配命令 reclink,这里再介绍一下数值模糊匹配命令 nearmrg。关于该命令更多介绍,请查看帮助文件 help nearmrg。
*生成一份数据
sysuse auto.dta, clear
keep make price mpg
keep if make == "Toyota Celica" | ///
make == "BMW 320i" | ///
make == "Cad. Seville" | ///
make == "Pont. Grand Prix" | ///
make == "Datsun 210"
rename make make2
save "using.dta", replace
list, clean noobs
列出数据:
make2 price mpg
Cad. Seville 15,906 21
Pont. Grand Prix 5,222 19
BMW 320i 9,735 25
Datsun 210 4,589 35
Toyota Celica 5,899 18