D2. 资料的合并与追加
作者:崔丽娟 (浙江大学)
邮箱:lijuanlj_cui@163.com
一般而言,我们在实证分析过程中用到的数据会有多个来源,只有把他们都合并起来才可以做最终的分析。本节我们介绍资料的合并与追加,主要包括横向合并与纵向合并。
1. 横向合并:增加变量
横向合并的主要作用是增加变量。如下图所示,假设我们的数据有两个来源: A 和 B,A 里可能包含 10 个变量,B 里包含另外 10 个变量,横向合并的基本要求就是将 A 和 B 这两份资料放到一起。
关键之处是 A 和 B 中每一行的数据要一一对应。例如,对于时间序列资料而言,合并之后的同一交易日的数据要一一对应;如果是面板数据资料,则同一家公司在同一会计年度的数据要一一对应。
在 Sata 中我们可以使用 merge
命令进行合并。
help merge
1.1 同维度合并 1:1
数据形态
在合并前先查看需要合并的两份数据:
use merge_m.dta, clear
browse
第一份数据是 merge_m.dta,包含 2001 年 1 月 2 日- 2001 年 12 月 31 日共 248 个交易日的三个变量,这三个变量分别是 x1_close、x2_volume 和 x3_change,如下图所示:
use merge_u.dta, clear
browse
第二份数据是 merge_n.dta,包含 2001 年 1 月 2 日- 2001 年 12 月 31 日共 248 个交易日的三个变量,这三个变量分别是 x4_open、x5_high、x6_low,如下图所示:
我们的目的是要将这两份数据的六个变量合并起来。
合并方法
use merge_m.dta, clear // master dataset 调入需要合并的数据
merge 1:1 date using merge_u // using dataset
请注意 merge
命令的语法,两份待合并的数据中都包含同一个变量 date
交易日,以保证两份数据合并之后同一交易日的数据一一对应; using
之后是用来合并的第二份数据 merge_u.dta;1:1
表示两份数据的维度是相同的 (下一小节会介绍一维对多维或多维对一维的数据的合并)。
结果如下:
use merge_m.dta, clear // master dataset
.
(S&P 500)merge 1:1 date using merge_u // using dataset
. of obs.
Result #
-----------------------------------------not matched 0
_merge==3)
matched 248 ( -----------------------------------------
合并结果显示,六个变量一一对应,并生成了一个新变量_merge
,_merge
取值为 1 表示该行数据仅来自第一份数据,_merge
取值为 2 表示该行数据仅来自第二份数据,_merge
取值为 3 表示该行数据同时来自两份合并数据。
1.2 高维对低纬合并 m:1
数据形态
use GTA_FS.dta,clear //上市公司财务资料,id-year, Panel
br use GTA_basic.dta,clear //上市公司基本资料,只有 id 没有 year
br
第一份数据是来自上市公司的财务资料,是一份面板数据(截面变量为 id ,时间变量为 year);第二份数据是上市公司的基本资料,只有 id 没有 year。
合并方法
use GTA_FS.dta, clear
merge m:1 id using GTA_basic.dta
br
注意此处 merge
命令的写法:两份数据的共有变量是 id,m:1
表示第一份资料的维度比第二份资料的维度高,即多维对一维的数据合并。
执行上述命令后,会自动生成新变量 _merge
,其取值含义为: - _merge==1
: obs. from master dataset - _merge==2
: obs. from only using dataset - _merge==3
: obs. from at least both datasets
1.3 一对多合并 1:m
合并方法
m:1 的逆向操作
*-Note: use GTA_basic.dta, clear
merge 1:m id using GTA_FS.dta, nogen
browseorder id year
year xtset id
注意此处 merge
命令的写法:两份数据的共有变量是 id ,m:1 表示第一份资料的维度比第二份资料的维度低,即一维对多维的数据合并。 nogen
选项表示合并后不生成新变量_merge
。
2. 纵向合并:追加样本
资料合并的第二种情形是纵向合并,即追加样本。例如,我们在某个数据库中获得了 2001-2010 年的数据资料,进一步又从另一个数据库获得了 2011-2013 年的资料并想将其追加到第一份资料的底部,即实现纵向合并。 基本原理如下图直观显示:A 是旧资料,需将新资料 B 追加到 A 的底部。追加的基本原则是 A 中的变量要与 B 中的变量一一对应,Stata 内部会自动查找 A 和 B 数据中同名的变量并匹配。
在 Sata 中我们可以使用 append
命令进行合并。
help append
- 两个数据库中的”同名变量”会自动对应累叠
*-数据形态use append_m.dta, clear
bruse append_u.dta, clear
br
*-纵向追加方法use append_m.dta, clear
append using append_u.dta
br
注意事项:
- 两个数据库中的变量名称要相同,大小写也要完全相同。PRICE 和 price 是不同的变量。
- 两个数据库中的同名变量要具有相同的存储类型。同为文字变量或同为数值变量。
其它相关命令
help mergeall
help mergemany
help nearmrg
help factmerg
help cross
help jionby
help addinby
扩展阅读
- 何庆红, 2020, Stata数据处理:纵横长宽转换-reshape命令一文读懂!(上), 连享会 No.1001.
- 刘欣妍, 2020, Stata:数据合并与匹配-merge-reclink, 连享会 No.461.
- 华晨, 2020, Stata数据处理:纵横长宽转换-reshape的兄弟-gather和spread.md, 连享会 No.1002.
- 左祥太, 2021, Stata 数据标签和合并, 连享会 No.756.
- 左祥太, 2021, Stata数据处理:快速合并与编码-encodefrom, 连享会 No.767.
- 张弛, 2024, Stata:numdate-超好用的日期转换函数, 连享会 No.1345.
- 李原, 2024, Stata:合并具有不同国家代码的数据集, 连享会 No.1360.
- 祖丽胡玛尔·热合曼, 2023, Stata:排序、种子值和随机数——为何每次的结果都不同?, 连享会 No.1314.
- 胡世亮, 刘欣妍, 2020, Stata数据处理:纵横长宽转换-reshape命令一文读懂!(下), 连享会 No.446.
- 谢作翰, 2021, Stata小白系列之二:数据拆分与合并, 连享会 No.719.
- 谢作翰, 连玉君, 2020, Stata小白系列之二:数据拆分与合并, 连享会 No.312.
- 连享会, 2020, multimport : 一次性导入并合并多个文件, 连享会 No.228.
- 连玉君, 2020, Stata: 如何快速合并 3500 个无规则命名的数据文件?, 连享会 No.227.
- 郭思媛, 2024, Stata数据处理:rangejoin-范围数据合并, 连享会 No.1474.
- 陈巧雯, 2024, Stata:通过数据框进行数据横向合并-framerge, 连享会 No.1499.
- 鞠瑶蕾, 2023, Stata:多对多合并-merge-joinby, 连享会 No.1255.