
New! 搜推文,找资料,用
lianxh
命令:
安装:ssc install lianxh, replace
使用:lianxh 合成控制
lianxh DID + 多期, w


作者: 刘欣妍 (香港中文大学)
E-Mail: liuxinyan@link.cuhk.edu.hk
[编者按]: 本文参考以下内容,介绍了 Stata 中用来合并数据的几种命令,特此致谢!
[Source]: COMBINING DATASETS USING STATA -Link-
目录
[[TOC]]
1. merge 命令:横向合并
在合并数据时,最常用的命令就是 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; - 匹配后,需将新生成变量 _merge 删掉,避免再次匹配时,提示变量 _merge 已被定义。另外,_merge = 1 表示正在使用的数据、_merge = 2 表示合并的数据、_merge = 3 表示成功合并的数据。
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
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
命令要求两份数据具有全部相同的变量,否则就会出现缺失值。
3. reclink 命令:字符串的模糊匹配
在横向合并时,若匹配变量在内容上有些差别,如在第一份数据中为「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
命令注意事项:
- 两份数据中 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
可以看出,该结果与前文结果具有一定差异。
当然,模糊匹配也可以使用 matchit
命令。更多有关 reclink
与matchit
的介绍请参考「Stata:模糊匹配之matchit」。
4. joinby 命令:多对多的匹配
在进行多对多匹配时,我们可以使用 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
。
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
然后,我们将该数据与 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 之内的数据都被保留了下来。
相关链接
- 专题: 数据处理
- 专题: Stata入门
- Stata小白系列之二:数据拆分与合并
- Stata小白系列之一:调入数据
- 普林斯顿Stata教程(一) - Stata数据处理
- Stata 数据清洗之实战操作系列,→ 项目主页
- Stata: 如何快速合并 3500 个无规则命名的数据文件?
- multimport : 一次性导入并合并多个文件
- Stata数据处理:reshape - 纵横变换-长宽转换
- 连享会:数据在哪儿?常用数据库链接
- Stata数据处理:各种求和方式一览
- Python:拆分文件让百万级数据运行速度提高135倍
- ⏩直播:动态面板数据模型


资源共享
- 连享会资料 ……
- 在线视频:lianxh-class.cn
- Stata 33 讲,100 万+ 播放,Stata 入门必备,公开课
- 直击面板数据模型,10 万+ 播放,白话面板模型,公开课
- … more …
- 论文复现和数据
- 主题分类
- 热门推文

尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

关于我们
- Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
- 扫码加入连享会微信群,提问交流更方便
