foreach的五个小秘密

2017-05-02 徐苾雯 爬虫俱乐部 爬虫俱乐部

五一假期过完啦,又迎来了一个新的月份,爬虫君一直陪在你身边。今天,小编就和大家说说关于foreach的五个小秘密。

当我们在stata中输入help foreach的时候,突然就跳出了这么多个foreach的用法:

之前我们大多使用foreach in的命令,为什么还有这么多foreach of呀,于是大呼傻傻分不清它们的用法。不要着急,且听小编慢慢道来foreach的秘密。我们用系统数据分别解释这几个foreach的用法,第一步当然是读取我们要用的数据sysuse auto

秘密一 

foreach lname in list { ... }

foreach in是我们需要循环时最为常用的命令,这种形式下允许一般形式的列表(list),列表中的各个元素用一个或多个空格彼此分离。

例如,在系统数据中:

foreach result in price mpg trunk-length {

   sum `result'

 }

在这个例子中,循环会被执行三次,即令result依次为用空格分开的price、mpg和trunk-length,来计算其描述统计量。

秘密二

foreach lname of varlist list { ... }

注意:在这里of与varlist是命令格式的一部分,list后面才是接具体的变量列表。在这种形式中,list中的变量依据标准变量缩写规则进行扩展。

例如:

foreach result of varlist price mpg trunk-length {

   sum `result'

 }

在 这个例子中,循环会执行五次,令result依次对price、mpg、trunk、weight、和length进行。注意这个例子与秘密一中例子的区 分,秘密一中仅是依据空格对变量进行循环,而这里,trunk-length表示从trunk到length的变量,对于系统数据,即包括变量 trunk、weight和length。

秘密三

foreach lname of local list { ... } 

foreach lname of global list { ... }

这 两种形式中,foreach lname of local list { ... }是对局部宏(local list)中的各项进行循环,foreach lname of global list { ... }是对全局宏(global list)中的各项进行循环。因为很多时候,我们事先并不知道具体的要循环的元素或是要循环的元素有很多,就将这些元素存储在宏中,所以这种形式也很常 见。在所有的循环方式中,这两种方式的执行速度是最快的。

例如:

local information "price mpg rep78 headroom trunk"

foreach A of local information {

   dis "`A'"

 }

当然,这里可以直接写为:

local information "price mpg rep78 headroom trunk"

foreach A in `information' {

   dis "`A'"

 }

得出来的是一样的结果,不信你试试~

global message "length turn displacement gear_ratio"

foreach B of global message {

   dis "`B'"

 }

同样,此处也可以写为:

global message "length turn displacement gear_ratio"

foreach B in $message {

   dis "`B'"

 }

小编提示:local是局部宏,如果在一个do文件中使用,那它只在那个do文件中有效,其好处是,在不同的do文件中,可以使用相同的宏名称,不会造成冲突。而global是全局宏,一旦定义,在别处也是存在的。

秘密四

foreach lname of newlist list {...}

与上一种形式相似,of与newlist也是命令格式的一部分,list中的列表为新的变量名称。在运行中stata会执行检查新的变量名是否有效,但不会自动创建。

例如:

foreach x of newlist v1-v6 {

   gen `x' =_n

 }

在这个例子中,循环会执行6次,从结果中我们可以看到已经生成了v1-v6六个新的变量,且表示第n个观测值。

秘密五

foreach lname of numlist list { ... }

同理,of与numlist也是命令格式的一部分,但list后是一个数字列表。在这种形式中,stata会按照数字的方式对列表进行解读。

例如:

foreach num of numlist 1/5 10 15(3)24 30/35 {

   dis `num'

 }

在这个例子中,对列表中所要求的数字依次进行循环,并依据要求展现出来。

这种形式的foreach命令与forvalue有着类似的作用,forvalues是对连续的数值进行循环的基本命令。语句:

forvalues lname = range {

        commands referring to `lname'

        }

但注意差别就在于“连续数值”哟。因此,在使用forvalues时,后面的列表中的数字必须是连续的,因此此处第一个连续的数字就可以如下表述:

forvalues num = 1/5 {

   dis `num'

 }

除了foreach in还有这么多好用的foreach命令,能够根据不同的需求执行循环命令,小秘密都告诉你们了,还不赶紧试着用起来~

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。

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

                       文字编辑:徐苾雯

技术总编:刘贝贝



往期推文推荐:

1.中国高校财经、管理与综合类期刊灌水排行榜

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

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

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

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.听说你想知道怎么用stata画地图?

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

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

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

投稿邮箱:statatraining@163.com

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

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号