参考 Stata for-loop 中的迭代次数

Refer to iteration number inside for-loop in Stata

像许多其他人一样,我经常循环遍历 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'
}

但是,当变量不是数字 and/or 的顺序不易于处理时,我经常想做类似的事情。假设我想对自动数据集中的 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 行,或者我们想做的任何事情)。

这一定是可行的,但我希望能提供一些建议。 clean/non-hackish 方式将是理想的,因为我会经常这样做。

您可以使用从 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
}

你也可以这样做。它不太可能像@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. 你可以数一数你循环了多少对象。它是字符串中的单词数。

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

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