我的Stata代码以:
开头local MyState "[STATE ABBREVIATION]"
用户输入州名缩写(例如"FL"
),然后运行代码。其余代码多次引用MyState
。例如:
keep if stateabb == `"`MyState'"'
replace Goal = .95 if stateabb == `"`MyState'"'
save "Results for `MyState'.dta", replace
if (stateabb == `"`MyState'"' & pickone==1) using ...
我经常有一个包含10个左右状态的列表,我需要运行此代码。它保存在名为"StatesToRun.dta,"
的表格中,其中包含一个变量名称"state"
。
有没有办法编辑我的代码,以便循环遍历表中的每个状态,并运行每个状态的完整代码?
我已经研究了foreach
和forval
示例,但无法弄清楚它们是否适用于这种情况。有什么建议?
答案 0 :(得分:1)
foreach
可以使用一个本地宏,其中包含您要循环的状态列表。缺少的部分实际上是创建此列表。为此,您可以在" StatesToRun"上使用levelsof
local
选项。数据集(不是Stata术语中的'表格)。 例如(未经测试):
use StatesToRun.dta, clear
levelsof state, local(statelist)
use data, clear
foreach MyState of local statelist {
keep if stateabb == `"`MyState'"'
replace Goal = .95 if stateabb == `"`MyState'"'
save "Results for `MyState'.dta", replace
if (stateabb == `"`MyState'"' & pickone==1) using ...
}
但是,除非你正在生成" StatesToRun.dta"从另一个Stata do文件中,似乎可以更容易直接在分析文件中定义状态列表。可以使用相同的基本方法:
local statelist MA NH VT ME CT RI PA NY
use data, clear
foreach MyState of local statelist {
keep if stateabb == `"`MyState'"'
replace Goal = .95 if stateabb == `"`MyState'"'
save "Results for `MyState'.dta", replace
if (stateabb == `"`MyState'"' & pickone==1) using ...
}
如果您想定义statelist
并在多个分析文件中使用它,请参阅help include
(注意include
和do
之间的区别):您可以定义statelist
在一个单独的do文件中include
,而不是创建一个带有单个变量的Stata数据集,其唯一目的是循环遍历此变量的不同值。