参考:Stata:数据合并与匹配-merge-reclink
简单合并:
*******year&city
tostring year ,gen(IND) ///把数据改成ind格式
gen yearcity=IND+city ///合并
Stata笔记代码:
*****1. merge 命令:横向合并
sysuse auto.dta,clear
keep if _n <=5
preserve ///将当前数据集的状态保存到内存中,以便在之后的操作中进行恢复
keep make price mpg
list, clean noobs noobs 不显示行数;clean让输出结果更紧凑
save d1.dta,replace
restore ///恢复。注意!!!PRE和RES要一整段运行,不能分多次运行
preserve
keep make weight length
list, clean noobs
save d2.dta,replace //第二份数据,包括了车辆的品牌,重量以及长度
restore
use d1.dta,clear
merge 1:1 make using d2.dta //可以keepusing(weight) 来限定只合并变量 weight;
keep if _merge==3 //保留匹配成功的数据
///【_merge 】= 1 表示正在使用的数据、_merge = 2 表示合并的数据、_merge = 3 表示成功合并的数据。
drop _merge //将创建的新变量_merge删除,避免后面再次匹配时,提示变量 _merge 已被定义
list, clean noobs
*****2.append 命令:纵向合并
sysuse auto.dta,clear
preserve
keep if _n <=5 //取前5个样本
keep make price mpg
save d1.dta,replace //第一个数据,包括了车辆的品牌,价格以及公里数
restore
preserve
keep if _n >=5 & _n <=10 //取第5-10个样本
keep make price mpg
save d2.dta,replace //第二个数据,包括了车辆的品牌,重量以及长度
restore
use d1.dta,clear
append using d2.dta //【append 命令】要求两份数据具有全部相同的变量,否则就会出现缺失值。
list, clean noobs
*****3.reclink 命令:字符串的模糊匹配
*应用场景:如在第一份数据中为「Princeton University」,而在第二份数据中为「Princeton U」
*输入两份数据
clear
input str13 name str14 city
"Zhang ziye" "Beijing"
"Liu biqian" "Shanghai"
"Hu,yi" "Guangzhou"
"Yang,Zhou" "Hennan"
end
gen id1=_n
save file1.dta, replace
clear
input str14 name str10 city
"Zhan, ziye" "beijing"
"LIU Biqian" "Shaanghai"
"huyi" "guangdong"
"Zhou yang" "henan"
end
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 ///matchscore 变量为匹配分数,分数越高代表匹配效果越好
*reclink 命令还允许对匹配变量设定不同权重。我们认为 city 是最重要的,则仅需增加 vmatch() 选项设定权重。赋予权重:name=1,city=15
use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore) wmatch(1 15)
list, clean noobs
*****4. joinby 命令:多对多的匹配
*输入数据
clear
input group str3 x1
1 "A"
1 "B"
1 "C"
1 "D"
end
save file1.dta,replace
clear
input group str3 x2
1 "M"
1 "N"
end
save file2.dta,replace
use file1.dta
list
use file2.dta
list ///显示数据
*merge 多对多匹配×
use file1.dta,clear
merge m:m group using file2.dta
list, clean noobs ///出问题,会用最后一行值 (比如这里的 file2.dta 的最后一行数据「group1,x2=N」) 进行重复合并,第一个匹配了M,后面全是N
*joinby 多对多匹配√
use file1.dta,clear
joinby group using file2.dta
list, clean noobs
*****5. 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
sysuse auto.dta, clear
///将using数据与 auto.dta 进行合并
nearmrg using "using.dta", upper nearvar(price) genmatch(usingmatch) limit(50)
///价格相差在正负 $50 的数据。
keep make price mpg make2 _merge usingmatch
list, clean noobs