查看原文
其他

神奇的组内交叉合并

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

本文作者:王玉洁,中南财经政法大学金融学院

本文编辑:温和铭

技术总编:李婷婷

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

导读

Hello,大家好呀!小编今天给大家带来Stata一个好用的命令——joinby。当我们进行数据的横向合并时,经常会用到merge命令,但是在使用merge命令进行一对一合并、一对多合并、多对一合并和多对多合并都不是我们想要的结果时,可以考虑使用joinby组内交叉合并。老规矩,还是先上命令语法和选项介绍。

一、命令介绍
1、命令语法
joinby [varlist] using filename [, options]
2、选项介绍

update:当master数据集中存在缺失值时,指定此选项可以使得using数据集中的非缺失值对其进行更新覆盖。

replace:这个选项只能与update一起使用。当指定此选项时,master数据集中的非缺失值将被using数据集的相应值替换。但是一个非缺失的观测值不会被一个缺失的观测值替换。

unmatched():当观测值不匹配时,指定此选项可以保留一个数据集的观测值。unmatched(none)表示忽略所有不匹配的观测值;unmatched(both)表示同时保留master和using数据集的不匹配的观测值;unmatched(master)表示仅保留master数据集中不匹配的观测值;unmatched(using)表示仅保留using数据集中不匹配的观测值。

_merge(varname) :使用此选项可以标记合并结果中观测值的来源,默认为_merge。

nolabel:这个选项可以防止Stata直接从using数据集复制值标签到master数据集。

二、案例应用

看完命令介绍,下面我们就小试牛刀,使用案例来看看joinby的具体用法吧!

首先,我们使用input命令生成两个具有公共变量id的数据集,然后使用joinby进行组内交叉合并,具体程序如下:

clear allinput id str3 v11 "a"1 "b"2 "c"2 "d"endsave 1.dta, replaceclearinput id str3 v21 "f"1 "g"2 "h"2 "i"2 "j"endsave 2.dta, replacejoinby id using 1.dta //使用id变量进行合并list

合并结果如下:

我们可以看到,使用input命令生成的两个数据集内有分组,在使用joinby命令时,按分组对数据进行交叉合并。

接下来,我们再来用一个小例子来看看joinby命令的update选项的具体用法。首先还是使用input命令生成两个具有公共变量name的数据集,然后再通过joinby进行组内交叉合并,同时比较使用和不使用update选项的区别,具体程序如下:

clear allinput str8 name English"Jane" 88"Bob" ."Betty" 90"Jack" 98endlistsave eng1.dta, replaceclearinput str8 name English"Jane" ."Bob" 95"Betty" 90"Jack" 98endlistsave eng2.dta, replace

以name为合并依据进行组内交叉合并,不使用update选项:

joinby name using eng1.dta

使用update选项时,using数据集中的非缺失值将对master数据集中的缺失值进行覆盖更新。

joinby name using eng1.dta, update

从运行结果来看,当不加update选项时,只保留匹配成功的数据,并且在默认情况下保留master数据集的值;当加上update选项时,master数据集中的缺失值会被using数据集中的非缺失值覆盖更新

借助上面的小例子,我们再来看看unmatched()_merge(varname)选项的用法。具体命令如下:

joinby name using eng1.dta, unmatched(master) _merge(_merge)

运行结果如下:

从运行结果可以看到,当master数据集中的数据与using数据集中的数据冲突时,指定unmatched(master)选项可以只保留master数据集中不匹配的观测值。

最后,我们使用删除上市公司在停复牌期间的事件作为一个综合案例进行说明。下面两张图中的数据分别表示事件列表和停复牌日期。

同一公司可能有多个事件,也可能发生多次停牌,只要某个事件,在任一停复牌期间内,就删除该事件。因此,对同一公司的每一个事件都与该公司所有的停复牌日期进行组内交叉合并,找到在停复牌时期内发生的事件,然后再将这些事件与事件列表进行横向合并,最后只保留非停复牌日期内的事件。具体程序如下:
use 事件列表,clearjoinby stkcd using 停复牌gen date1 = date(date,"YMD")gen num = 1 if date1 >= startdate & date1 <= enddate

keep if num == 1merge 1:1 stkcd date using 事件列表keep if _m == 2keep stkcd date

运行结果如下:

以上就是今天介绍的全部内容了,是不是迫不及待想自己试试呢?需要数据的小伙伴在后台回复“停复牌”即可哦。

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐
        
PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

在Stata中轻松运用program编写命令

Meta Analysis in Stata17      

芒果TV视频弹幕爬取之《我在他乡挺好的》

Stata中的判断神器——confirm命令

cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

随机森林-Random Forest 

复原之神--preserve&restore

合并,“纵”享新丝滑:frameappend & xframeappend
什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts 

Stata助力疫情打卡管理——是谁没有接龙呢?

这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?

【案例展示】Python与数据库交互

学好这一手,英语词典常在手 

玩转Stata中的数学函数

用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

简述递归

OpenCV库——轻松更换证件照背景色

关于我们 


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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。




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

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