添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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"       
    gen id1=_n
    save file1.dta, replace
    clear
    input str14 name str10 city  
    	"Zhan, ziye"  "beijing"       
    	"LIU Biqian"  "Shaanghai"        
    	"huyi"        "guangdong"     
    	"Zhou yang"   "henan"    
    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 命令。更多有关 reclinkmatchit 的介绍请参考「Stata:模糊匹配之matchit」

    4. joinby 命令:多对多的匹配

    在进行多对多匹配时,我们可以使用 mergejoinby 命令,但二者又具有哪些差别?具体示例如下:

    *输入数据
    clear
    input group str3 x1
          1  "A"
          1  "B"
          1  "C"
          1  "D"
    save file1.dta,replace
    clear
    input group str3 x2
          1  "M"
          1  "N"
    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倍
  • ⏩直播:动态面板数据模型
  • 连享会-直播课 上线了!
    http://lianxh.duanshu.com

    免费公开课:

  • 直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页
  • Stata 33 讲 - 连玉君, 每讲 15 分钟.
  • Stata 小白的取经之路 - 龙志能,时长:2 小时,课程主页
  • 部分直播课 课程资料下载 (PPT,dofiles等)
  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
  • 连享会主页  lianxh.cn
    连享会主页 lianxh.cn

    连享会小程序:扫一扫,看推文,看视频……