循环遍历表中的值列表

时间:2015-10-22 15:22:16

标签: loops foreach stata

我的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"

有没有办法编辑我的代码,以便循环遍历表中的每个状态,并运行每个状态的完整代码?

我已经研究了foreachforval示例,但无法弄清楚它们是否适用于这种情况。有什么建议?

1 个答案:

答案 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(注意includedo之间的区别):您可以定义statelist在一个单独的do文件中include,而不是创建一个带有单个变量的Stata数据集,其唯一目的是循环遍历此变量的不同值。