“环环”入扣之foreach命令

Stata中的循环语句一共分为三类:while循环、foreach循环以及forvalues循环。其中,foreach循环和forvalues循环均可以看做是while循环的衍生。但是相较于forvalues命令,foreach命令更加灵活。二者的区别在于forvalues循环的对象必须是数字,而foreach循环的对象可以是变量、局部宏以及文件等。接下来,小编将会和大家一起学习一下foreach命令的具体用法。

一、命令语法

foreach命令的语法格式如下:
foreach lname {in|of listtype} list {    commands referring to `lname'}
接下来对该命令的几种具体形式进行介绍:
1.foreach lname in any_list {
这种命令格式是对一般形式的列表进行循环,且列表中的各个元素都是用空格分开的。
2.foreach lname of local lmacname {
或者 foreach lname of global gmacname {
这两种命令格式是分别对局部宏 lmacname全局宏 gmacname 中的各项元素进行遍历循环。在所有的循环方式中,这两种循环的执行速度是最快的。
3.foreach lname of varlist varlist {
在这种命令格式中,of 和第一个 varlist 是该命令格式的第一个部分,第二个 varlist 是进行遍历循环的变量列表。
4.foreach lname of newlist newvarlist {
其中,foreach ... of newlist ... 是该命令格式的一部分,newvarlist 是新变量列表。Stata 会检查所指定的新变量名是否有效,但是这些新变量名并不是由 Stata 自动生成的。
5.foreach lname of numlist numlist {
其中,foreach ... of numlist ... 是该命令格式的一部分,numlist 是数字列表。

二、实例操作

第一种:变量循环

打开Stata自带的数据集,然后利用foreach命令对数据集里面的 price、weight、length三个变量进行遍历循环和对数转换,生成三个新的变量并添加变量标签。
sysuse auto,clearforeach v of varlist price weight length {    gen ln_`v' = ln(`v')   /*生成新的变量 ln_`v',该变量是对原始变量的对数转换*/    label variable ln_`v'  "ln(`v')"  /*为新变量添加标签*/}list
结果如下:
可以看到,在结果窗口中出现了三个新的变量(已用红色标框标注),然后查看变量窗口,可以发现新变量均添加了对应的标签:

第二种:局部宏循环

打开Stata的示例数据集,首先将数据集里面的 price、weight、length 三个变量存储在vars中,然后通过foreach命令对vars中的元素进行遍历循环并生成新的变量,然后通过label选项为新变量添加标签。
sysuse auto,clearlocal vars price weight length  /*将三个进行遍历循环的变量存储在vars中*/foreach v of local vars {     gen `v'_1 = `v'/2  /*生成新的变量`v'_1,该变量是原始变量的二分之一*/    label variable `v'_1  "`v'/2"}list
通过结果窗口,可以看到新产生了三个变量(红色标框标注),且这三个新变量的对应标签如下:
在使用这种命令格式进行局部宏循环时,要注意:命令语句 foreach ... of local ... 已经指定了将会从局部宏中选取元素进行遍历循环,因此在引用 vars 时就不需要再添加` '

第三种:数字循环

foreach num of numlist 1 4/8 13(2)21 103 {    display `num'}
其中,4/8 表示依次显示4-8之间的数字,13 (2) 21表示从13开始,每隔2显示一次,直到21结束。执行结果如下:

第四种:文件循环

调用内存中的两个数据文件(可通过后台回复female.dta、male.dta获取),gender = 0表示 female,gender = 1表示 male,显示如下:
然后,通过foreach循环和append命令将两个数据文件进行纵向合并。
clear allcd D:\mydataforeach file in female.dta male.dta {    append using `file'  /*纵向合并*/}list, sep(4)
结果如下:
到此,有关于foreach循环命令的介绍就结束啦~
(0)

相关推荐