查看原文
其他

frlink:让连接更具“目的性”

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

本文作者:杨慧琳

文字编辑:朱巧利

技术总编:王   悦


爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~



在前期推文《Stata16新功能之“框架”——frlink连接多个数据集(3)》中,我们已经介绍了frlink命令的常见用法。在本文中,我们以一个更加直观的例子来介绍如何使用frlink命令实现面板数据的匹配与连接。

我们首先温习一下frlink命令在连接数据集时的基本步骤,大致分为两 步:                                                                                         
第一步:创建连接变量

frlink {1:1|m:1} varlist₁, frame(frame₂ [varlist₂]) [generate(linkvar₁)]

其中,varlist₁、varlist₂分别为当前框架及被连接框架frame₂下的匹配变量,若frame₂中匹配变量与当前框架的匹配变量重名,则可不指定varlist₂。在建立连接后,将在当前框架存储的数据集中生成一个连接变量,可以使用选项generate()设定连接变量名为linkvar;否则,默认生成的连接变量与frame₂同名。

第二步:依据连接变量整合数据集

frget varlist, from(linkvar₁) [rename_options]

frget newvar = varname, from(linkvar₁)

依据上一步生成的连接变量linkvar₁,从frame₂存储的数据集中获取一系列变量varlist,变量名保持不变。若获取的是目标数据集中的单个变量varname,也可在当前数据集中将其重新命名为newvar。from(linkvar₁)为必选项。

 
在此基础上,我们构建一个小案例来实现以上操作。具体思路为:

1)在当前默认框架下生成一个面板数据集,用于存储2015-2017年间三个班级36名学生的数学和英语成绩;

(2)分别新建两个框架,用于存储2015-2017年间三个班级的数学和英语任课老师信息;

(3)使用frlink命令连接三个框架下的数据集。

 
1)生成学生成绩信息
在当前默认框架default下,生成2015-2017年间三个班级36名学生的成绩信息:
clear allframe rename default student //将当前默认框架重命名为studentset obs 36 gen year = mod(_n,3)+2015bysort year: gen class= mod(_n,3)+1 //生成班级号bysort year: gen stu_id = _n //生成各班学生编号gen math=50+uniform()*50 //生成数学成绩gen english = 50+uniform()*50      //生成英语成绩

数据情况如下:其中,每一年对应3个班级,编号为123,每个班级对应4名不同学生。每对year-class联合取值出现4次。

其中,每一年对应3个班级,编号为1、2、3,每个班级对应4名不同学生。每对year-class联合取值出现4次。

 

2)生成任课老师信息
新建框架math_teacher ,并在该框架下生成2015-2017年间三个班级的数学任课老师信息:
mkf math_teacher //创建新框架math_teachercwf math_teacher //转入新创建的框架下clear set obs 9gen year=2015 in 1/3replace year=2016 in 4/6replace year=2017 in 7/9bysort year: gen class_id = _n gen teacher ="Math"+string(_n)
类似地,生成英语任课老师信息:
mkf eng_teachercwf eng_teacherclear set obs 9gen year=2015 in 1/3replace year=2016 in 4/6replace year=2017 in 7/9bysort year: gen class_id = _n gen teacher ="Eng"+string(_n)


其中,每个班级各年对应一个不同的老师,编号为Eng1-Eng9(或Math1-Math9)。每对year-class_id联合取值都是唯一的。
 
3)连接三个框架下的数据集
切换回框架student下,选取当前数据集中的year和class作为匹配变量。令被连接框架为math_teacher,匹配变量为year和class_id,生成一个连接变量mlink,如下:
cwf studentfrlink m:1 year class,frame(math_teacher year class_id) gen(mlink)
而后,通过连接变量mlink,获取框架math_teacher下的数学任课老师信息变量teacher,并在当前数据集中重命名为math_teacher。程序和结果如下:
frget math_teacher=teacher, from(mlink)


其中,连接变量mlink的取值依yearclass的联合取值而定。在该例子中,对于year-class而言,其有9种不同的联合取值情况,分别为2015-12016-12017-1…2016-32017-3,对应变量mlink9个不同取值,即19
以同样的方法获取框架eng_teacher下的英语任课老师信息,如下:
frlink m:1 year class,frame(eng_teacher year class_id) gen(elink)frget eng_teacher=teacher, from(elink)


经过以上步骤,我们便整合了三个数据集中的信息。当然,以上结果也可以利用merge命令实现,但其要求各个数据集中具有相同的匹配变量,且需分别保存与调用数据集。

 

对此,我们也可总结出frlink命令的一些优点:首先,可以在同一内存中实现数据集合并,避免了多次保存与调用数据集的冗余操作;其次,允许各个数据集的匹配变量名不同,通过某一特定的连接变量获取数据;再次,用户可以依据自身需求从目标框架中获取特定变量,实现更加精准化的数据合并。但是,frlink命令用法不太灵活,不如merge命令直观。同时,当前其仅支持1:1m:1两种匹配形式,不支持1:m的匹配形式,这也使frlink命令的应用受到一定的限制。



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

Selenium的等待方式

一举拿下函数图像

BvD数据库介绍之Osiris

来!左边跟我一起画个龙在你右边画一道彩虹~

Selenium登录豆瓣

妙用正则表达式--Python中的re模块(二)

cngcode和cnaddress新鲜出炉!

数据可视化之地理图

“气功”研究哪家强

数据长、宽整型之另辟蹊径

10分钟带你走进宝藏数据库BvD

实战演练——爱婴医院中莆田系医院数据分析(一)

给你一个贴心的reshape应用

asrol命令——让你的描述性统计信息滚动起来
Python带你看文献—xpath抓取知网文献
您有一份天气预报待签收 

关于我们

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

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


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

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