我有一个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
}
答案 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
假设此处的变量name
为price
。现在你想要可变价格的长度。
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 */
}