参考 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 的顺序不易于处理时,我经常想做类似的事情。假设我想对自动数据集中的 price
、mpg
、weight
和 length
做同样的事情。如果我们将 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'
}
总分是
单词之间用空格隔开,只是双引号和复合双引号绑定的比较紧。因此 a
、b
和 c
是 a b c
中的词,但 Stata "is great"
中只有两个词
你可以数一数你循环了多少对象。它是字符串中的单词数。
将 tokenize
应用于参数字符串会将该参数的单独单词映射到名为 1
、2
等的本地宏。可能暗示的嵌套宏引用的解释就像您从初等代数中猜测的那样:首先评估最里面的参数。
对于更复杂的问题,包括 varlist 的解包,另请查看 unab
。
像许多其他人一样,我经常循环遍历 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 的顺序不易于处理时,我经常想做类似的事情。假设我想对自动数据集中的 price
、mpg
、weight
和 length
做同样的事情。如果我们将 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'
}
总分是
单词之间用空格隔开,只是双引号和复合双引号绑定的比较紧。因此
a
、b
和c
是a b c
中的词,但Stata "is great"
中只有两个词
你可以数一数你循环了多少对象。它是字符串中的单词数。
将
tokenize
应用于参数字符串会将该参数的单独单词映射到名为1
、2
等的本地宏。可能暗示的嵌套宏引用的解释就像您从初等代数中猜测的那样:首先评估最里面的参数。
对于更复杂的问题,包括 varlist 的解包,另请查看 unab
。