7 流程语句
7.1循环语句:while
任务7.1:用循环语句编写程序,依次列出1,2,3,4,5
程序示例:
*============================begin=================================
capture drop count5
program count5
local i=1          //先将宏名为i的宏值设为1
while `i<=5 {  //判断如果宏值`i不大于5,就执行{}中的命令,否则跳开
while语句都可以用for改写display `i        //要干的活是显示宏值`i
local i=`i+1        //重新设定宏名为i的宏值,令其等于`i+1
}
end
*============================end==================================
count5
1
2
3
4
5
看看这些结果,`i最初设为1,因为1小于5,因此显示1;显示完毕紧随其后的命令,将i重新设定(即加上1),重新设定后`i现在等于2,由于2仍然小于5,于是显示2,并再次重新设
定i,,直到`i与6等价,不再小于等于5,跳出循环{},执行end.
补充知识:数列的表示方法
2        just one number
1 2 3        three numbers
3 2 1        three numbers in reversed order
.5 1 1.5        three different numbers
1 3 -2.17 5.12        four numbers in jumbled order
1/3        three numbers: 1, 2, 3
3/1        the same three numbers in reverse order
5/8        four numbers: 5, 6, 7, 8
-8/-5        four numbers: -8, -7, -6, -5
-5/-8        four numbers: -5, -6, -7, -8
-1/2        four numbers: -1, 0, 1, 2
1 2 to 4        four numbers: 1, 2, 3, 4
4 3 to 1        four numbers: 4, 3, 2, 1
10 15 to 30        five numbers: 10, 15, 20, 25, 30
1 2:4        same as 1 2 to 4
4 3:1        same as 4 3 to 1
10 15:30        same as 10 15 to 30
1(1)3        three numbers: 1, 2, 3
1(2)9        five numbers: 1, 3, 5, 7, 9
1(2)10        the same five numbers: 1, 3, 5, 7, 9
9(-2)1        five numbers: 9, 7, 5, 3, and 1
-1(.5)2.5        the numbers: -1, -.5, 0, .5, 1, 1.5, 2,    2.5
1[1]3        same as 1(1)3
1[2]9        same as 1(2)9
1[2]10        same as 1(2)10
9[-2]1        same as 9(-2)1
-1[.5]2.5        same as -1(.5)2.5
1 2 3/5 8(2)12        eight numbers: 1, 2, 3, 4, 5, 8, 10, 12
1,2,3/5,8(2)12        the same eight numbers
1 2 3/5 8 10 to    12    the same eight numbers
1,2,3/5,8,10 to    12    the same eight numbers
1 2 3/5 8 10:12        the same eight numbers
7.3循环语句:forvalues
程序示例:
*============================begin=================================
forvalues i=1/5 {
display `i            //和上一个命令完全等价,只是写法更简洁
}
*============================end==================================
程序示例3:
*============================begin=================================
forvalues i=4 (-0.2) 0//起始值可大于终值,但步长应为负,步长可为小数
display `i
}
*============================end==================================
forvalues做循环时,其命令格式为
    forvalues lname = range {
                commands referring to `lname'
        }
  其中 range 为
                            #1(#d)#2    从#1 开始,到#2 结束,步长为 #d   
                            #1/#2        从#1 开始,到#2 结束,步长为 1     
                            #1 #t to #2    从#1 开始,到#2 结束,步长为(#t - #1)
                            #1 #t :  #2    从#1 开始,到#2 结束,步长为(#t - #1)
上述#可以为任何数:负数,小数。
任务7.2:用循环语句编写程序,计算1+2+3++100
程序示例:
*============================begin=================================
scalar s=0            //scalar命令生一个标量s
forvalue i=1/100 {
scalar s=s+`i’        //该标量s不断被替换,每一次都被加一次
}
scalar list s
*============================end===================================
7.3循环语句:foreach
任务5.3(按变量循环):打开数据文件wage1,对nonwhite ,female ,married,numdep,smsa ,northcen ,south ,west,construc,ndurman ,trcommpu,trade , services,profserv ,profocc ,clerocc ,servocc 这些变量分别求频数分布。(提示频数分布命令为tab varlist)
*============================begin=================================
use fmwww.bc.edu/ec-p/data/wooldridge/ wage1, clear
tab nonwhite
tab female
tab married
tab numdep
tab smsa
tab northcen
tab south
tab west
tab construc
tab ndurman
tab trcommpu
tab trade
tab services
tab profserv
tab profocc
tab clerocc
tab servocc
*============================end==================================
对凡事讲究效率的现代人来说,这也够烦的,可是while还是forvalues都无能为力,因为我们所想要的是,对每个变量进行循环。现在是foreach一显身手的时候了。上面老长的命令,只需要下面几行字。
程序示例:
*============================begin=================================
use wage1,clear
foreach v of varlist nonwhite-servocc {
                                tab `v
    }
*============================end==================================
foreach做循环时,其命令格式为
foreach lname {in|of listtype} list {
                commands referring to `lname'
        }
例如:
        foreach lname in any_list {
        foreach lname of local lmacname  {
        foreach lname of global gmacname  {
        foreach lname of varlist varlist    {
        foreach lname of newlist newvarlist {
          foreach lname of numlist numlist    {
可以是数值、变量、文件等。
任务7.4:将student.dta, economy.dta, math.dta纵向拼接起来
*============================begin================================
use student, clear
foreach file in economy math {
    append using `file’”
      }
*或者
local flist economy math          //先将文件名赋于宏flist
foreach file in `flist {
    append using `file’”
      }
*============================end==================================
任务7.5(按项循环):逐行显示粮食(rice wheat flax maize)和货币(Dollar Lira Pound RMB)
*============================begin=================================
local grains rice wheat flax maize
foreach x of local grains {
      di `x’”
  }
global money Dollar Lira Pound RMB
foreach y of global money {
        di `y’”
  }
*============================end=================================
任务7.6(生成新变量):生成五个新变量b1,b2,b3,b4,b5,每个变量都是均匀分布随机数
*============================begin=================================

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。