Stata16新功能之“框架”——读入多个数据集(1)
本文作者:王 悦
文字编辑:王碧琪
技术总编:李朋冲
爬虫俱乐部将于2019年8月22日至28日在湖北武汉举行为期一周的Stata编程技术定制培训,此次培训采用Stata16进行讲解,采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~
详细培训大纲及报名方式,请点击文末阅读原文呦~
在Stata15及之前的版本中,那些具有“老司机”属性的Stata用户往往会在use/sysuse调用某个数据集后,加上clear选项,这样做的目的在于清空内存中已经存在的数据及标签。Stata16之前的版本,一次只能读入一个数据集,当读入一个新的数据集时,如果Stata内存中已有某个未保存的数据,在不加clear选项的情况下,Stata将会提示代码为r(4)的报错信息:
sysuse cancer
keep in 1/10 //对数据进行了更改但未保存
sysuse auto //调用一个新的数据
点击r(4)可以看到:
它告诉我们,数据至少在上次更改之后没有保存,而正在执行的命令将更改或销毁数据。Stata这样的报错信息,也是为了让大家注意保存自己的原始数据,毕竟数据获取不易。如果希望继续,需在命令末尾添加clear选项,否则先保存数据。
Stata内存中一次只能读入一个数据集的遗憾,在新推出的Stata16版本中得到了弥补,我们可以将不同的数据集加载到不同的frame(或者frames:框架,或称为数据框)中。Stata16允许同时在内存中拥有多个框架,用户可以在它们之间切换,甚至将某个数据链接到其他数据框中的数据。我们后续会通过一系列推文,带领大家走入frame的世界~
1.切换自如:不同框架下的数据集随意导入
像在之前版本的Stata中一样,我们仍然利用sysuse命令调用系统自带数据cancer.dta,在Stata16中,刚刚被调用的数据集被自动加载到一个默认名为default的框架中,接下来我们可以创建一个新框架,将另一个数据集加载到其中,执行一些任务,再切换回来,然后再删除该框架。具体程序和结果如下所示:
clear all
sysuse cancer, clear
frame create new //新建一个名为new的框架
frame new: sysuse auto //将auto.dta加载到名为new的框架中
frame //查看当前框架是哪一个,也可以用 frame pwf
frame dir //查看内存中所有的数据框架:default和new,以及数据的维度、每个数据集中的数据标签(如果存在)
frame change new //将当前框架default切换到框架new
frame pwf
tabstat price weight mpg rep78, stat(n mean sd min max) col(stat)
frame change default //从当前框架new切换到框架default
frame
frame drop new //删除框架new
frame dir //删除框架new之后,仅剩余框架default
在这里有两点需要注意:
1)在不做特殊规定的情况下,Stata中各项命令的操作对象是当前工作框架中的数据。那么当内存中有多个框架时,究竟哪一个才是当前框架呢?输入frame或者pwf(print working frame)即可查看;
2)如果想要删除某个框架,而它恰好当前正在被使用,那么必须先利用frame change或者cwf(change working frame)切换当前工作框架,再通过frame drop进行删除。
这样一来,上述程序既对框架new中的数据进行了想要的操作,又没有影响到框架default。随着新建的框架new被删除,我们又回到了原始框架default,仿佛一切从未发生过一样……
2.分身“有”术:复制框架进行计算
当我们需要从某个数据集中计算一个值并将其添加回原数据集中,但计算涉及到修改数据,怎样才可以实现不破坏原始数据又能得到该值呢?frames在这个时候就可以大显身手了~
clear all //清空当前除default之外的数据框架
sysuse auto, clear
frame copy default subtask //复制当前数据到新建框架subtask
frame change subtask //从default切换到新建框架subtask
sort price foreign
keep in 1/30 //修改了数据,只保留了前30个汽车数据
sum price if foreign == 1
ret li //输入return list,我们可以看到返回值r(mean) = 4117.143
frame change default
gen dmpg = cond(price>`r(mean)',1,0) //生成一个变量dmpg,当price大于r(mean)时,dmpg为1,否则为0
frame drop subtask
order make price dmpg
br
上述程序最终成功地将变量dmpg添加到default框架原始数据集中,在这里需要注意:虽然r(mean)是在框架subtask中通过sum price if foreign == 1得到的,但它实际上是储存于Stata内存之中,与框架无关。当然,使用preserve/restore也能实现这样的操作,但是在框架中,输入frame change能够实现在不同的数据集中来回切换,而preserve/restore显然不具备此项功能。
3. 插上翅膀:框架使Stata中preserve/restore运行得更快
很多使用Stata编写的程序,会借助命令preserve/restore将数据暂时保存在内存中并在稍后进行恢复。而在Stata16中,那些包含preserve/restore的程序,其运行速度将会大大地提高,这是因为Stata16是将数据复制并保存到隐藏的框架中去,那些隐藏框存储在Stata内存之中,而将数据复制到框架所需的时间,则比将数据复制到磁盘要短得多。
更准确地说,preserve先是将数据加载到隐藏的框架中,但当存储在隐藏框中的内存数量超过了某个规定的值时,Stata才会在磁盘上保存后续数据集,该值可以通过参数max_preservemem进行设置。要找出max_preservemem的值,可以输入:
query memory
在默认的情况下,max_preservemem的值为1g,g代表gigabyte即十亿字节,你可以通过setmax_preservemen将内存设置为0-1600g之间的任意一个值。比如:
set max_preservemem 2g
query memory
而在set max_preservemem 2g后面加上选项permanently,则可以将当前内存永久地设为二十亿字节。
以上是对于frame功能的简单介绍,当然,不同框架下数据集的互通是最大的亮点,以上的第二部分只是它功能的一部分,我们可以使用frame put、frlink、frget、frame post等命令实现数据集的互通与连接。限于篇幅,frame的更具体的用途,我们会在后续的推文中展开。
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
万般进制千机变,Python一计乾坤定——利用Python来进行进制转换
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。