循环输出统计文件
本文作者:钱梦璇
文字编辑:王碧琪
技术总编:李朋冲
爬虫俱乐部将于2019年8月22日至28日在湖北武汉举行为期一周的Stata编程技术定制培训,此次培训采用Stata16进行讲解,采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~
详细培训大纲及报名方式,请点击文末阅读原文呦~
在Stata中,使用循环(loop)语句编写程序会为我们解决很多不必要的麻烦,帮助我们提高编程的效率。在遇到一些变量多且具有规律的数据文件时,我们往往通过循环快速简洁地得到自己想要的结果。
一个循环主要分为三个部分:循环命令、循环对象以及循环操作的主体。常用的循环命令有while,forvalue和foreach。循环对象包括数字、变量名以及变量里面包含的特征和文件名,而循环操作的主体通常指的是我们重复编写的代码。
在对字符型或者无规律数值型变量进行循环时,while和forvalue是无能为力的,此时就需要foreach大显身手,帮助我们解决实际问题。foreach主要操作的循环对象有变量、宏(local和global)、数值和文件。
循环本身并不复杂,但是变量和宏之间的关系是核心。在用foreach做循环时,一般的命令格式为:
foreach lname{in|of listtype} list{
commands referring to `lname'
}
例如:
1. foreach lname in any_list
这种形式允许一般形式的列表,列表中的各个元素需要用空格分开;
2. foreach lname of local lmacname
对局部宏lmacname中各项进行循环,我们事先不知道具体的要循环的元素,将这些元素存储在宏中;
3.foreach lname of global gmacname
对全局宏gmacname中各项进行循环。
举一个简单的例子:利用foreach循环逐行显示学科Chinese, Math, English, Politics, Geography。
local subject Chinese Math English Politics Geography
foreach x in `subject'{
di "`x'"
}
显然,这样对每个变量依次循环的方法减少了一个一个输出变量的麻烦。
关于foreach循环,读者问过这样一个问题,在一个项目中,他需要创建一份关于每个合作伙伴每个成员每月提交的报告的频率。希望此代码在不同名称的合作伙伴、成员和日期之间保持不变,以便将来可以将其用于类似的结构化数据,而无需重新指定名称。
小编编写了一个样例数据member.dta,并新建文件夹“E:\mydata”,将创建的dta文件放于该路径下。如下,该dta文件中共包括6个成员(member),分别来自3个不同的组织(member_organization)。其中,date代表成员提交报告的日期。由于目标是创建每月提交的频率,故单独列出月份month.
使用input命令输入样例数据(后面程序将使用tabout命令生成用表达式命名的文件名,为了便于将表达式中的变量拼接起来,在此将date和month变量也设定为字符型):
clear
cap mkdir E:/mydata
cd E:/mydata
input str5 member str13 member_organization str3 date str1 month
Tom organization1 713 7
Linda organization2 714 7
Jim organization1 715 7
Kevin organization2 715 7
Linda organization2 725 7
Hans organization3 724 7
Angel organization3 728 7
Kevin organization2 730 7
Tom organization1 814 8
Linda organization2 816 8
Angel organization3 815 8
Jim organization1 824 8
Tom organization1 828 8
Angel organization3 910 9
Jim organization1 913 9
Linda organization2 915 9
Hans organization3 920 9
Tom organization1 923 9
Kevin organization2 920 9
Angel organization3 925 9
end
save member
使用foreach循环输出文件:
levelsof member_organization,local(organization)
foreach partner in `organization'{
use member.dta,clear
keep if member_organization == "`partner'"
levelsof month, local(months)
foreach mth in `months'{
tabout member if month == "`mth'" using "`mth'_`partner'.txt"
}
}
levelsof命令显示member_organization的不同值的排序列表,并将其放入局部宏organization中,从而可在后续程序中直接调用宏里的变量取值。
其次,使用foreach循环,逐次保留member.dta文件与宏中对应的观测值,并依次输出。tabout命令生成用于导出到文本文件的表,在此程序中,将导出以月份和合作伙伴命名的txt文件。通过tabout命令,得到的9个txt文件名分别如下所示:
由样例数据我们可以直接看出organization1中成员Tom和Jim在7月份提交报告的频率都为1,organization2中成员Linda和Kevin在7月份提交报告的频率都为2.对比输出结果,来验证是否符合实际情况。
7_organization1.txt中的显示结果为:
7_organization2.txt中的显示结果为:
观察其他几个文件中的结果,也均符合实际情况。这样,通过foreach循环程序,一份关于每个合作伙伴每个成员每月提交的报告的频率的文件就完成了,以后遇到类似的结构化数据便可以直接运用。
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。