我正在运行几个命令块,其中每个块与数据集的特定子样本相关。每个块中的代码都有所不同,因此我无法对所有子样本运行for
循环。此外,代码块被连接(一些块输出作为输入馈送到其他块),所以我不能只运行分离的do文件。
目前,我在每个命令中使用条件if sample == i
运行do文件(其中sample
的值表示数据集的子样本)。然而,这是耗时且不太优雅的。我正在寻找一个像:
set sample = 1
code
code
code
set sample = 2
code
code
set sample = 3
code
code
到目前为止,我还没有发现任何Stata命令/扩展允许我这样做。有什么想法吗?
答案 0 :(得分:2)
如果您使用优秀的文本编辑器在逗号之前或行尾快速插入if exp
,我认为这样的事情会更容易。
但是,您可以像这样在线定义迷你程序:
sysuse auto, clear
capture program drop block1
program define block1
syntax if
regress price mpg `if'
sum `if'
end
block1 if foreign==0
block1 if foreign==1
capture program drop block2
program define block2
syntax if
tw hist price `if'
scatter price weight `if'
end
block2 if if price > 2000
block2 if foreign==1
答案 1 :(得分:1)
另一种接近此方法的方法可能是使用preserve和restore命令。您的代码如下:
preserve
keep if x==1
code
code
code
restore
preserve
keep if x==2
code
...
就个人而言,我认为这使代码易于遵循,但缺点是速度/效率,因为Stata正在创建临时文件,然后重新加载原始数据。因此,如果您在保留和恢复步骤之间执行大量命令,我只会使用它。