【问题标题】:Refer to iteration number inside for-loop in Stata参考Stata中for循环内的迭代次数
【发布时间】:2015-07-06 23:41:36
【问题描述】:

像许多其他人一样,我经常在 Stata 中遍历变量,运行一些估计命令,然后将结果提取到为保存它们而创建的变量中。当变量按顺序编号或以某种模式编号(例如一组中的偶数)时,这很简单。举个例子:

sysuse auto
gen var1 = uniform()
gen var2 = uniform()
gen var3 = uniform()

*Create variables to hold results
gen str4 varname=""
gen results=.

*Loop through three variables
foreach i of numlist 1/3{
    replace varname="var`i'" in `i'
    sum var`i'
    replace results=r(mean) in `i'
}

但是,当变量不是数字和/或不是易于处理的顺序时,我经常想做类似的事情。假设我想对自动数据集中的pricempgweightlength 做同样的事情。如果我们将 for 循环设置为:

sysuse auto
gen str4 varname=""
gen results=.

foreach var of varlist price mpg weight length{
    sum `var'

    *Place values, in order, in rows?
}

那么我们需要一些方法来理解price 是列表中的第一个变量,所以它的结果应该放在第 1 行(或者它的名字放在第 1 行,或者我们想要做的任何事情)。

这一定是可能的,但我会很感激一些建议。一种干净/非黑客的方式将是理想的,因为我会经常这样做。

【问题讨论】:

    标签: stata


    【解决方案1】:

    您可以使用从 1 开始并在每次迭代结束时递增的本地计数器:

    sysuse auto, clear
    gen varname=""
    gen mean=.
    local i=1
    
    foreach var of varlist price mpg weight {
         quietly sum `var'
         replace mean = r(mean) in `i'
         replace varname = "`var'" in `i'
         local ++i
    }
    

    【讨论】:

    • 完美。我不知道这里的 ++ 选项。
    • 也可以写成local i=`i'+1。
    • 我很惭愧我从来没有想过这个。我偶尔会在循环中选择性地使用局部宏,但从没想过事先将 i 设置为 1 然后递增。
    【解决方案2】:

    您也可以这样做。它看起来不像@Dimitriy V. Masterov 解释的标准技术那样直接或简单,但它有它的用途。

    sysuse auto, clear
    gen varname = ""
    gen mean = .
    
    local nvars : word count price mpg weight 
    tokenize "price mpg weight" 
    
    quietly forval j = 1/`nvars'  {
         sum ``j'', meanonly 
         replace mean = r(mean) in `j'
         replace varname = "``j''" in `j'
    }
    

    一般要点是

    1. 单词用空格分隔,但双引号和复合双引号结合得更紧密。因此abca b c 中的单词,但Stata "is great" 中只有两个单词

    2. 您可以计算正在循环的对象数量。它是字符串中的单词数。

    3. tokenize 应用于参数字符串会将该参数的单独单词映射到名为12 等的本地宏。可能暗示的嵌套宏引用的解释就像您从基本代数中猜测的那样:首先评估最里面的参数。

    对于更复杂的问题,包括对 varlist 的解包,另请查看 unab

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 2012-10-27
      • 2012-08-07
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2010-12-28
      相关资源
      最近更新 更多