【有问必答】嵌套循环帮你解决计算问题

2016-12-01 朱子奇 爬虫俱乐部 爬虫俱乐部

在处理复杂的数据的过程中,我们常常会使用foreach与forvalues等循环语句来提高工作效率。那么,在循环中嵌套循环会是什么样的情况呢?



华中师范大学的一位美女老师(美女老师记得给爬虫赏个铜板好咩~)给我们提供了一个难题

其 原始表格是一份学生实践安排调查统计表,学生在一天的时间安排有10项内容,从上课(1)到其他(10),原始问卷中要求学生在a-p个时间区间内在这 10项活动中选择一个,其中,chdid指的是学生的id,a-o变量表示不同的时间段,并且以1小时为间隔,但p变量是晚间21:00到第二天早上 6:00的9小时间隔。


其数据结果如下:



而我们目的

统计每个学生每项活动在一天24小时内的时间加总。比如,在上图中,活动(1)为上课,我们需要统计一个学生“上课”在24小时中有多少个小时。而24小时分布在a-p的16个区间,其中,a-o变量上,每出现一次,记为一小时;若出现在p上,记9小时,最后将其加总。


对于这个问题,我们可以先通过活动1“上课”来进行简单的循环测算。

先, 我们通过生成0-1变量来判断在a-p时间段中,每个学生是否在上课。如果学生在a-p时间段中上课ing,则记为1,反之记为0。比如,我们判断每个学 生是否在a时间段内上课,我们可以通过replace a =(a ==1)来实现。那么对于活动a-p,我们可以加入一个循环:


clear

set more off

cd C:\Users\Administrator\Desktop

use schedule.dta,clear

foreach alpha in a b c d e f g h i j k l m n o p {

 replace `alpha'=(`alpha'==1)

 }



后,我们需要生成一个act1变量,代表每个学生一天中上课时间的总和。此时,我们需要利用rowtotal()函数,对a-p时间段中的上课时间进行求和,其代表的意思为:act1=a+b+c+d+……+o+p。与sum()函数不同的是,sum()是对列数据来求和,rowtotal()是对行数据来求和。

着,由于p变量是晚间21:00到第二天早上6:00的9小时间隔,所以我们需要在act1的基础之上,再加上8p,即replace act1=act1+8*p:程序实现如下:


egen act1=rowtotal(a-p)

replace act1=act1+8*p

list chdid act1


后,我们需要整理一下数据,而我们想要保留的是chdid、act1两个变量,并且将数据保存到act1.dta文件中,其程序的实现方法如下:


keep chdid act1

sort chdid 

save act1, replace



那么对于10项活动而言,我们则将活动1进行替换成宏i,嵌套一个forv i=1(1)10的循环。分别计算出活动1-活动10在一天中所占的时间。但是,我们已经在计算活动1的时间中,已经修改了原始数据,那么我们就要利用preserverestore来对原始数据来起死回生:


forvalue i =1/10 {

 preserve 

  foreach alpha in a b c d e f g h i j k l m n o p {

    replace `alpha'=(`alpha'==`i')

    }

  egen act`i'=rowtotal(a-p)

  replace act`i'=act`i'+8*p 

  keep chdid act`i'

  sort chdid 

  save act`i', replace 

 restore 

}


然后,我们再将之前保存的数据act1-act10分别merge拼接起来,就得到我们想要的数据:


forvalue j = 1/10 {

   sort chdid

   merge chdid using act`j', nokeep

   drop _m

   }



以上就是今天小编与大家分享的全部内容了。说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~,点赞打赏随您心意,么么哒~


应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


编辑by强宇曦


往期推文推荐:

1.天路——chinafin与cntrade命令

2.分时数据,从此唾手可得

3.送你一只粘合剂——用openall命令合并数据

4.免费的股价同步性,一片片从邮局寄来

5.免费事件研究,一片片从邮局寄来

6.厉害了,我stata哥

7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

8.据说这样数据替换比较快,你试一下,然后……

9.有了这个命令,以后还怕重复?

10.I have a Stata, I have a python

11.用subinfile修改文件,滚蛋吧,繁琐的命令君!

12.删繁就简三秋叶,subinfile似剪刀





关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

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

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



长按关注你懂得哦~

微信扫一扫
关注该公众号