【问题标题】:For Loop: can the end value come from the value of a variable?For循环:最终值可以来自变量的值吗?
【发布时间】:2013-07-22 20:18:25
【问题描述】:

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

【问题讨论】:

  • 本地限制 = 50(或任何上限)不起作用吗?然后你可以做 forvalues x=1(1)limit...

标签: for-loop stata


【解决方案1】:

根据我阅读的文档,可以使用宏,但需要注意的是,在 forvalues 循环中更改范围的结尾不会影响循环发生的次数。比如forvalues循环开始时length(name)为50,而你在循环中改变name的长度,它仍然只会循环50次。

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

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

具体来说:

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

还有:

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

local n 3

 forvalues i = 1(1)`n' {

 local n = `n' + 1

display `i'

}

Output:

1

2

3

【讨论】:

    【解决方案2】:

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

    sysuse auto 
    

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

    sum price 
    gen length=r(N)
    

    要查看r(N) 是什么,请在运行sum price 后键入return list

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

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

    或:

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

    注意:不清楚你为什么要for loop。所以我的回答仅限于你所要求的。

    【讨论】:

      【解决方案3】:

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

      从类似的东西开始

        . su price, meanonly 
        . forval j = 1/`r(N)' {
      

      【讨论】:

      • 感谢您让我知道这一点。
      【解决方案4】:

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

      sysuse auto, clear
      
      count if !missing(price)
      
      forvalues x = 1 / `r(N)' {
         /* Code goes here */
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多