本文作者:田志凡
文字编辑:张语盈
技术总编:高金凤
好消息!!!爬虫俱乐部将于2019年7月5日至7月8日在武汉举行首期Python编程技术定制培训。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python爬虫技术,并明确未来更进一步的学习方向。
如下,我们有两个数据:北京和上海的房屋价格信息(图1);购房者信息(图2)。图2所示数据集中的三人想要在自己可接受的价格范围内购买一套房子,而所有的房屋信息在图1所示数集中。我们怎么样帮助这三个人快速找到合适的房子呢?

图1:房价信息

图2:购房者信息
我们今天介绍的rangejoin命令将帮助我们实现这一功能,该命令与我们常用的merge命令相似,用来将两个数据集进行横向合并。但不同于merge命令的是,rangejoin命令在横向合并数据时,可以根据一个范围进行合并。如上述“找房子”的问题,使用rangejoin命令可直接给每一个购房者数据(图2)匹配上在其价格上下限中的房屋数据(图1)。详细介绍如下:
rangejoin命令是外部命令,且使用时依赖rangestat命令,使用rangejoin前需安装这两个命令,程序如下:
ssc install rangestat,replacessc install rangejoin,replace
主要语法:
rangejoin keyvar low high using using_dataset [, options]
其中,keyvar是待匹配数据集(using_dataset)中的一个数值型变量,是“合并”的关键依据。该变量在主数据集中可以存在也可不存在,在下面的例子中,我们将区分这两种情况来介绍。
low和high是匹配的范围,可以是主数据集中的变量,也可是两个数值。
常用的选项有by(),表示分组后进行匹配,即两两匹配上的行首先要满足分组变量的值相同。
案例:为购房者匹配合适的房子。
首先读入示例数据,分别为各个购房者所能接受的价格区间数据,以及包含房屋定价信息的数据。
各个购房者所能接受的价格区间信息如下:
clearcd D:/tempinput str5 姓名 价格下限 价格上限 str6 城市Peter 300 500 上海Paul 400 600 上海Mary 600 700 北京endsave 购房者信息.dta,replace
房屋定价信息如下:
clearinput houseID 房价 str6 城市1 111 北京2 222 北京3 333 北京4 444 北京5 555 上海6 666 上海endsave 房价.dta,replace
1、为每一个购房者匹配上可接受价格上下限中的房子
clearuse 购房者信息.dta,clearrangejoin 房价 价格下限 价格上限 using 房价.dta

结果如上图,Peter匹配到北京的两所房子,Paul匹配到北京、上海各一所房子,Mary匹配到了上海的一所房子。
注意到,主数据集(购房者信息.dta)中也有“城市”这一变量,为了区分,using数据集(房价.dta)中的“城市”加上了默认的后缀_U,即“城市_U”。
当然,这一后缀名也可以通过选项suffix( ) 来设置,如下:
(1)添加后缀
use 购房者信息.dta,clearrangejoin 房价 价格下限 价格上限 using 房价.dta, suffix(_control)
那么,如果购买者想要在自己生活的城市中找房子呢?在这里我们可以添加选项by( ),来进行分组匹配。如下:
(2)分组匹配
use 购房者信息.dta,clearrangejoin 房价 价格下限 价格上限 using 房价.dta, by(城市)
结果如下:只有Paul找到了合适的匹配组。

(3)指定“数值”匹配范围
rangejoin语法中的low和high也可以用两个数值来表示,匹配的范围是就是low和high这两个数值。如下:
use 购房者信息.dta,clearrangejoin 房价 200 600 using 房价.dta, by(城市)
结果如下:在同一个城市内,只要房价在200和600之间,购房者信息数据就能与该房价数据合并。

2019年6月22日至24日在河南郑州举行Stata编程技术特别训练营,此次课程的特点是零基础、案例教学、循序渐进。此次课程受河南牧业经济学院金融学院和会计学院邀请而特别定制,我们的课室还有20台机位,为回馈河南地区粉丝长期以来对我们的支持,本次课程将推出最优惠的价格面向河南省内的高校教师和学生进行小规模招生!
2、为每一个购房者匹配在“理想价格”附近的房子
在前面的介绍中,我们知道,匹配中的关键变量keyvar是using_dataset中的一个数值型变量,但当主数据集中也存在keyvar时,此时可以根据主数据集中的keyvar变量来设定匹配的范围。
举例如下:我们在主数据中增加一个“房价”变量(keyvar),相当于每一个购房者的“理想房价”,然后在该“理想房价”附近进行匹配。
use 购房者信息.dta,cleargen 房价=400+_n //随机生成一个购房者理想房价的数据,为400+行号rangejoin 房价 -100 100 using 房价.dta, by(城市)
此时,using数据集中的房价变量,只要在主数据集中的“房价”+100和-100的范围内即可匹配成功。
结果如下图:Mary在北京找到了两所理想房价附近的房子。

注意,此时low和high是两个数值,若low和high是主数据集中的两个变量,则匹配的结果同上述“情况1”。
在下篇推文中我们将介绍使用rangejoin给处理组“找”控制组的案例,欢迎关注~

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


