2

我有一个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

4 回答 4

3

根据我阅读的文档,可以使用宏,但需要注意的是,在 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. display `i' 4. } forvalues 需要文字数字。允许使用宏,如以下技术说明所示。

和:

允许使用宏,如以下技术说明所示。技术说明 循环边界的值在第一次执行循环时一次性确定。更改循环边界将无效。例如,不会创建无限循环。'n' 最初等于 3,循环将执行 3 次。

local n 3

 forvalues i = 1(1)`n' {

 local n = `n' + 1

display `i'

}

Output:

1

2

3
于 2013-07-22T20:38:38.793 回答
2

@Metrics 的第一个代码将无法正常工作。这是一个更好的方法,去掉我所说的中间宏。

从更像的东西开始

  . su price, meanonly 
  . forval j = 1/`r(N)' {
于 2013-07-23T07:35:47.517 回答
2

这是我认为可能对您有用的Stata技巧。我正在使用来自 Stata 数据集的数据自动。

sysuse auto 

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

sum price 
gen length=r(N)

运行后查看r(N)类型是什么。return listsum price

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

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

或者:

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

  dis "`i'" 
   }

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

于 2013-07-22T23:15:09.150 回答
0

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

sysuse auto, clear

count if !missing(price)

forvalues x = 1 / `r(N)' {
   /* Code goes here */
}
于 2018-06-10T20:56:17.390 回答