在处理复杂的数据的过程中,我们常常会使用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的时间中,已经修改了原始数据,那么我们就要利用preserve与restore来对原始数据来起死回生:
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强宇曦
往期推文推荐:
7.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
长按关注你懂得哦~
微信扫一扫
关注该公众号