D2. 资料的合并与追加

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

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

global path "D:\LY_stata" // 将 【LY_stata】文件夹放置于 D 盘根目下
cd "$path\_data"        //所有范例数据存于此处

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_close、x2_volume 和 x3_change,如下图所示:

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

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

图3 merge_n 数据查看

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

  • 合并方法
use merge_m.dta, clear        // master dataset 调入需要合并的数据
merge 1:1 date using merge_u  // using  dataset
br

请注意 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)
    -----------------------------------------
.       br

图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 命令的写法:两份数据的共有变量是 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]

  • 合并方法
*-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
  • 几个注意事项:
    1. 两个数据库中的变量名称要相同,大小写也要完全相同。PRICE 和 price 是不同的变量。
    1. 两个数据库中的同名变量要具有相同的存储类型。同为文字变量或同为数值变量。

Also See

  help mergeall
  help mergemany
  help nearmrg
  help factmerg
  help cross
  help jionby
  help addinby

扩展阅读

  • Stata数据处理:reshape - 纵横变换-长宽转换 view browse “https://www.lianxh.cn/news/c48db52c26ba5.html”
  • 连享会:数据处理专题 view browse “https://www.lianxh.cn/blogs/25”