D2. 资料的合并与追加

作者:崔丽娟 (浙江大学)
邮箱

一般而言,我们在实证分析过程中用到的数据会有多个来源,只有把他们都合并起来才可以做最终的分析。本节我们介绍资料的合并与追加,主要包括横向合并与纵向合并。

1. 横向合并:增加变量

横向合并的主要作用是增加变量。如下图所示,假设我们的数据有两个来源: A 和 B,A 里可能包含 10 个变量,B 里包含另外 10 个变量,横向合并的基本要求就是将 A 和 B 这两份资料放到一起。

关键之处是 A 和 B 中每一行的数据要一一对应。例如,对于时间序列资料而言,合并之后的同一交易日的数据要一一对应;如果是面板数据资料,则同一家公司在同一会计年度的数据要一一对应。

图1 横向合并的基本原理

在 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_closex2_volumex3_change,如下图所示:

图2 merge_m 数据查看
use merge_u.dta, clear
browse

第二份数据是 merge_n.dta,包含 2001 年 1 月 2 日- 2001 年 12 月 31 日共 248 个交易日的三个变量,这三个变量分别是 x4_openx5_highx6_low,如下图所示:

图3 merge_n 数据查看

我们的目的是要将这两份数据的六个变量合并起来。

合并方法

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
    Result                           # of obs.
    -----------------------------------------
    not matched                             0
    matched                               248  (_merge==3)
    -----------------------------------------

图4 合并结果显示

合并结果显示,六个变量一一对应,并生成了一个新变量_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 命令的写法:两份数据的共有变量是 idm: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

合并方法

*-Note: m:1 的逆向操作
    use GTA_basic.dta, clear
    merge 1:m id using GTA_FS.dta, nogen
    browse
    order id year
    xtset id year

注意此处 merge 命令的写法:两份数据的共有变量是 id ,m:1 表示第一份资料的维度比第二份资料的维度低,即一维对多维的数据合并。 nogen 选项表示合并后不生成新变量_merge

2. 纵向合并:追加样本

资料合并的第二种情形是纵向合并,即追加样本。例如,我们在某个数据库中获得了 2001-2010 年的数据资料,进一步又从另一个数据库获得了 2011-2013 年的资料并想将其追加到第一份资料的底部,即实现纵向合并。 基本原理如下图直观显示:A 是旧资料,需将新资料 B 追加到 A 的底部。追加的基本原则是 A 中的变量要与 B 中的变量一一对应,Stata 内部会自动查找 A 和 B 数据中同名的变量并匹配。

图5 纵向追加的基本原理

在 Sata 中我们可以使用 append命令进行合并。

help append
  • 两个数据库中的”同名变量”会自动对应累叠
*-数据形态
     use append_m.dta, clear
         br
     use 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

扩展阅读