循环访问许多没有规则的名称



当名称很少时,在Stata中循环很容易。

此外,当有关于名称如何更改的规则(例如增量(时,我可以执行以下操作:

forval i = 1/5 {
...
}

然而,在某些情况下,我需要循环使用数百个名称,这些名称没有增量规则。

例如:

48700 48900 48999 49020 49180 49340 ...

有没有写循环的捷径?还是我必须煞费苦心地把它们都列出来?

答案是这取决于

如果这些是变量名的一部分,你可以这样做:

clear
set obs 5
foreach var in 48700 48900 48999 49020 49180 49340 {
generate var`var' = runiform()
}
ds
var48700  var48900  var48999  var49020  var49180  var49340
ds var48*
var48700  var48900  var48999
local names `r(varlist)'
foreach var of local names {
display `var'
}
.41988069
.06420179
.36276805

如果这些是文件名,则可以使用宏扩展函数:

dir, w
48700.rtf       48999.rtf       49180.rtf
48900.rtf       49020.rtf       49340.rtf
local list : dir . files "*"
display `list'
48700.rtf48900.rtf48999.rtf49020.rtf49180.rtf49340.rtf
local list : dir . files "48*"
display `list'
48700.rtf48900.rtf48999.rtf
foreach fil of local list {
display "`fil'"
}
48700.rtf
48900.rtf
48999.rtf

编辑:

上述方法涉及如何有效地获取本地宏中的所有相关名称。

如果你已经知道这些名称,并且你只想用一种更干净的方式来编写循环(或者想在几个循环中重复使用这些名称(,你可以自己在本地宏中分配这些名称:

local names var48700 var48900 var48999 var49020 var49180 var49340
foreach var of local names {
display `var'
}
.41988069
.06420179
.36276805
.52763051
.16493952
.66403782

本地宏names将在运行时自动展开,以包括所有指定的项。

最新更新