温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 刘欣妍 (香港中文大学)
E-Mail: liuxinyan@link.cuhk.edu.hk
[编者按]: 本文参考以下内容,介绍了 Stata 中用来合并数据的几种命令,特此致谢!
[Source]: COMBINING DATASETS USING STATA -Link-
目录
在合并数据时,最常用的命令就是 merge
,该命令会根据两个数据集中「至少一个共同变量」进行横向合并。具体示例如下:
*利用 auto 数据创建两份新的数据集
sysuse auto.dta,clear
keep if _n <=5 //取前5个样本
preserve
keep make price mpg
list, clean noobs
save d1.dta,replace //第一份数据,包括了车辆的品牌,价格以及公里数
restore
preserve
keep make weight length
list, clean noobs
save d2.dta,replace //第二份数据,包括了车辆的品牌,重量以及长度
restore
第一份数据:
make price mpg
AMC Concord 4,099 22
AMC Pacer 4,749 17
AMC Spirit 3,799 22
Buick Century 4,816 20
Buick Electra 7,827 15
第二份数据:
make weight length
AMC Concord 2,930 186
AMC Pacer 3,350 173
AMC Spirit 2,640 168
Buick Century 3,250 196
Buick Electra 4,080 222
对两份数据进行横向合并:
use d1.dta,clear
merge 1:1 make using d2.dta
keep if _merge==3 //保留匹配成功的数据
drop _merge //将创建的新变量_merge删除
list, clean noobs
横向合并后结果:
make price mpg weight length
AMC Concord 4,099 22 2,930 186
AMC Pacer 4,749 17 3,350 173
AMC Spirit 3,799 22 2,640 168
Buick Century 4,816 20 3,250 196
Buick Electra 7,827 15 4,080 222
merge
命令注意事项:
merge
可以进行 1:1 (一对一匹配)、1:m (一对多匹配)、m:1 (多对一匹配)、以及 m:m (多对多) 匹配,但不建议使用 m:m (多对多) 匹配,因为这样容易造成数据的混乱;using d2.dta
后,可以通过 keepusing()
指定合并变量。如,可以在后面加上 keepusing(weight)
来限定只合并变量 weight;
除上述横向合并外,我们还可以进行纵向合并。具体示例如下:
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
list, clean noobs
纵向合并后结果:
make price mpg
AMC Concord 4,099 22
AMC Pacer 4,749 17
AMC Spirit 3,799 22
Buick Century 4,816 20
Buick Electra 7,827 15
Buick Electra 7,827 15
Buick LeSabre 5,788 18
Buick Opel 4,453 26
Buick Regal 5,189 20
Buick Riviera 10,372 16
Buick Skylark 4,082 19
需要注意,append
命令要求两份数据具有全部相同的变量,否则就会出现缺失值。
在横向合并时,若匹配变量在内容上有些差别,如在第一份数据中为「Princeton University」,而在第二份数据中为「Princeton U」,我们可以通过 reclink
命令快速模糊匹配,以避免繁琐的人工识别。具体示例如下:
*输入两份数据
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
模糊匹配后结果:
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
命令注意事项:
idmaster(id1)
、idusing(id2)
分别代表 master data 中的 id 和 using data 中的 id,结果第五列和第七列解读为 master data中的id1 = 1 和 using data 中的 id2 = 1 匹配成功;reclink
命令可解决的匹配问题:大小写不同、部分字母缺漏或增加、以及顺序颠倒;另外,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
可以看出,该结果与前文结果具有一定差异。
当然,模糊匹配也可以使用 matchit
命令。更多有关 reclink
与matchit
的介绍请参考「Stata:模糊匹配之matchit」。
在进行多对多匹配时,我们可以使用 merge
或 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
*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)
可以看出,merge
命令的多对多合并是有问题的,其会以较少数据文件的最后一行值 (比如这里的 file2.dta 的最后一行数据「group1,x2=N」) 进行重复合并。
joinby
命令多对多匹配结果:
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
。
上文已经介绍了字符串模糊匹配命令 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
然后,我们将该数据与 auto.dta 进行合并,并找出 using.dta 数据中价格浮动在 $50 上下的数据。
sysuse auto.dta, clear
nearmrg using "using.dta", upper nearvar(price) genmatch(usingmatch) limit(50)
keep make price mpg make2 _merge usingmatch
list, clean noobs
make price mpg make2 _merge usingm~h
Datsun 210 4,589 35 Datsun 210 matched (3) 4,589
Buick Regal 5,189 20 Pont. Grand Prix matched (3) 5,222
Pont. Grand Prix 5,222 19 Pont. Grand Prix matched (3) 5,222
Olds Cutl Supr 5,172 19 Pont. Grand Prix matched (3) 5,222
Dodge Magnum 5,886 16 Toyota Celica matched (3) 5,899
Toyota Celica 5,899 18 Toyota Celica matched (3) 5,899
BMW 320i 9,735 25 BMW 320i matched (3) 9,735
Audi 5000 9,690 17 BMW 320i matched (3) 9,735
Cad. Seville 15,906 21 Cad. Seville matched (3) 15,906
可以看出,using data 中原有 5 行数据,合并后变成了 9 行数据。之所以如此,是因为 auto.dta 中价格浮动在 50 之内的数据都被保留了下来。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页 Stata 33 讲 - 连玉君, 每讲 15 分钟. Stata 小白的取经之路 - 龙志能,时长:2 小时,课程主页 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 因果推断, 空间计量,寒暑假班等 | |
⭕ 数据清洗系列 | 游万海 | 直播, 88 元,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD