查看原文
其他

“合”我在一起—merge

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:石   艳,中南财经政法大学统计与数学学院

文字编辑:戴   雯 

技术总编:余术玲

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营在不久前已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!     

1.导读

在我们的日常生活中经常会见到各种各样的表格,这些表格包含不同的信息。比如一个班主任,他有一个关于学生信息的表格,包括学生姓名,年龄等信息,各位任课老师也有这个班级学生的各科成绩。如果我们想进一步了解这个班级学生的信息,那么就会考虑把这些表格进行横向合并,这时就要用到我们今天介绍的命令—merge。

2.命令介绍

merge是将来自当前内存中的数据集(master dataset)的相应观察值与来自外部的数据集(using dataset)的观察值按照指定的关键变量进行横向拼接,具体有以下几种形式。

merge 1:1 varlist using filename [, options]

对指定的关键变量进行一对一的合并

merge m:1 varlist using filename [, options]

对指定的关键变量进行多对一的合并

merge 1:m varlist using filename [, options]

对指定的关键变量进行一对多的合并

merge m:m varlist using filename [, options]

对指定的关键变量进行多对多的合并

merge 1:1 _n using filename [, options]

通过观察值进行一对一的合并

注意:此处的“多”和“一”是指指定的关键变量在不同数据集中所对应的观察值。

3.选项介绍

merge的选项比较多,在此处我们结合例子介绍一些比较常用的选项,主要选项有以下几个:

(1)keepusing(varlist) :用来保留合并时using dataset中的部分变量,默认保留全部。

(2)generate(newvar):产生一个新的用来标记合并结果的变量,默认情况下是_merge。

(3)nogenerate :不产生用来标记合并结果的变量。

(4)noreport :不显示匹配结果表。

(5)update :使用using dataset中变量的值更新master dataset中同名变量的缺失值,master dataset中的非缺失值不变。

(6)replace :使用using dataset中变量的非缺失值代替master dataset中同名变量的值,using dataset中的缺失值对应的master dataset中的同名变量值不变。此选项要和update一起使用。

(7)force :强制字符串/数字变量类型匹配而不会出错。

(7)keep(results) :指定要保留的匹配结果。

(8)assert(results) :指定执行所需的匹配结果。

首先我们先用input输入两个数值变量类型,并将数据保存起来以备调用,命令如下:

clear allcap mkdir d:/mergecd d:/mergeinput id x1 x2 x3 x41 0 1 1 42 1 1 2 23 1 . 3 24 . 3 5 110 2 4 3 5endsave example1,replace
clearinput id x1 x21 0 11 . 12 1 32 2 .3 2 44 1 .4 2 320 2 4endsave example2,replace

以example2为master dataest,example1为using dataset,可以观察到以id为关键变量进行合并是一个m:1的合并,先看一下默认情况下的合并情况:

use example2,clearmerge m:1 id using example1list,sepby(id) //在不同的id之间用横线分隔,便于观察

结果分为两部分,第一部分为匹配结果表,它展示了匹配结果的总体情况。从表中可以看出匹配成功的有七个观察值,匹配成功的标记即为_merge=3;没有匹配成功的有两个观察值,结果分别为 _merge=1(数据仅仅来自master data)和 _merge=2(数据仅仅来自using data)。第二部分是把匹配结果展示出来,从中可以看到合并时默认保留了example1中所有变量的值,且在两个数据集都有相同变量时(如x1和x2),结果会以master data中的为主。

3.1 noreport

使用noreport选项时,就会把默认情况下的第一部分省略,只剩第二部分的结果。

use example2,clearmerge m:1 id using example1,noreportlist,sepby(id)

3.2 generate,nogenerate

使用这两个选项可以改变标记合并结果的变量

use example2,clearmerge m:1 id using example1,keepusing(x3) nogeneratelist,sepby(id)

在上述命令中我们还使用了keepusing(x3),可以看到在进行两个数据集的合并时,只保留了example1的x3变量,并且只有合并后的数据,没有标记变量。

use example2,clearmerge m:1 id using example1,keepusing(x3) generate(type)list,sepby(id)

使用generate(type)产生一个用来标记合并结果的新变量type。

3.3 update replace

使用这两个选项更新缺失值

use example2,clearmerge m:1 id using example1,updatelist,sepby(id)


可以观察到原本example2中x1,x2中缺失值都由example1中的同样变量相应值进行了更新。除此之外,标记合并结果的变量除了之前的1、2、3的值外,有了4和5这两个值。其中_merge=4代表至少一个缺失值被更新,没有与using data(此处为example1)冲突的非缺失值;_merge=5代表其中至少一个重叠变量的值有和using data(此处为example1)冲突的非缺失值。

use example2,clearmerge m:1 id using example1,update replacelist,sepby(id)

当同时使用update和replace时,会发现example2(maser data)的重叠变量的值全部由example1中的值来代替,在example1(using data)中重叠变量有缺失值除外。

3.4 assert,keep

使用这两个选项可以指定合并结果

use example2,clearmerge m:1 id using example1,assert(3)list,sepby(id)

这时系统会报错,因为我们事先要求进行两个数据集的完全匹配,也就是以 _merge=3的形式进行合并,但并不是所有的观察值都符合这种匹配方式的,所以会报错。这时可以去数据集看一下,和默认结果并没有什么不同,但不会展示。

use example2,clearmerge m:1 id using example1,keep(3)list,sepby(id)

当使用keep()选项时要求为先进行默认的合并,然后保留_merge=3的结果,如图所示,只保留了我们想要的结果。

这就是对于merge命令和选项的简单介绍啦,通过以上几个例子可以发现merge的功能和选项还是比较丰富的,小伙伴们赶快用起来吧!





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
在Sustainability上发文最多的原来是这些高校

Python中的这些运算符你真的会用吗?

字符串函数总动员

用词云图看2020社科基金课题~
建议收藏!Python精选推文干货合集
xpose和sxpose,谁是卧底?
让你的数据一目了然--label命令介绍
Python推文合集基础篇(下)|算法简介
【小白指南】Python中有哪些数据类型?(附推文合集)
轻松获取通行数据——cntraveltime命令介绍
让Stata完美牵手中国地图之cnmapsearch
自然语言分析——利用NLTK进行文本预处理
寻找B站的最爱--8月B站全站榜爬虫
cnaddress命令——实现经纬度转换为中文地址
定位神器——cngcode
Python入门—Spyder的简单使用
Jupyter Notebook 的这些tips你了解吗?
给变量名换马甲之rename命令
追踪命令set trace on——解你燃眉之急
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存