For Loop:最终值可以来自变量的值吗?

时间:2013-07-22 20:18:25

标签: for-loop stata

我有一个forvalues循环:

forvalues x = 1(1)50 {
   /* Code goes here */
}

而不是50,理想情况下,我希望该值如下所示。我有一个变量name。让length = length(name)。无论length的最大值是什么,我希望它代替50。我无法想象如何编写一个forvalues循环,其中终点不是用数字直接表示的。

我想我可以推断出变量的最大长度如下:

gen id = 1
gen length = length(name)
by id, sort: egen maxlength = max(length)

从那里我不知道如何将这个值存储到for循环中。

或者,这会被while循环更好地编码吗?

类似的东西:

gen x = 1
while (x <= maxlength) {
   /* Same Code Here */
   replace x = x + 1
}

4 个答案:

答案 0 :(得分:4)

根据我读过的文档,可以使用宏,但需要注意的是,在forvalues循环中更改范围的结尾对循环的发生次数没有影响。例如,如果forvalues循环开始时length(name)为50,并且你在循环中更改了name的长度,它仍然只会循环50次。

从技术上讲,你最好使用while循环,因为当范围的结尾是文字值时,会使用forvalues。你可以使用forvalues循环,但你 应该使用while循环。

这是我的支持来源: http://www.stata.com/manuals13/pforvalues.pdf

具体来说:

  

技术说明   输入法律语法不合法   。标量x = 3   。 forvalues i = 1(1)x' { 2. local x = x'+ 1   3.显示“我”   4.}   forvalues需要文字数字。使用宏,如以下技术说明所示,是   允许的。

并且:

  

使用宏,如以下技术说明所示,是   允许。   技术说明   循环边界的值被确定一次,并且第一次执行循环。   更改循环边界将不起作用。例如,   不会创建无限循环。当`n'原来等于3时,循环将执行三次   次。

local n 3

 forvalues i = 1(1)`n' {

 local n = `n' + 1

display `i'

}

Output:

1

2

3

答案 1 :(得分:3)

以下是Stata的诀窍,我认为可能对你有用。我正在使用Stata数据集中的数据自动。

sysuse auto 

假设此处的变量nameprice。现在你想要可变价格的长度。

sum price 
gen length=r(N)

在运行r(N)后查看return list类型sum price的内容。

在你的循环中,它如下所示:(根据@Nick更新)

forvalues x = 1/`r(N)'{
   /* Code goes here */
}

或者:

 local length=r(N)
   forvalue i=1/`length'{

  dis "`i'" 
   }

注意:目前尚不清楚为什么要for loop。所以我的答案仅限于您要求的内容。

答案 2 :(得分:3)

@Metrics的第一个代码不太合适。这是一个更好的方法,削减我称之为中间宏。

从更像

的东西开始
  . su price, meanonly 
  . forval j = 1/`r(N)' {

答案 3 :(得分:1)

@Nick和@Metrics提出的方法的等效方法如下:

sysuse auto, clear

count if !missing(price)

forvalues x = 1 / `r(N)' {
   /* Code goes here */
}