luc*_*cho 3 foreach loops stata
我有一组 18 个 Stata 数据文件(每年一个),其名称为:
{aindresp.dta, bindresp.dta, ... , rindresp.dta}
Run Code Online (Sandbox Code Playgroud)
我想从每个数据集中消除一些变量。为此,我想利用数据集中的许多变量具有相同名称的事实,加上数据集前缀(a、b、c、...r)给出的前缀。例如,该变量在 dataset等中rach12被调用。因此,为了清理每个数据集,我运行如下循环:arach12aindresp.dta
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
save `var'indresp.dta, replace
}
Run Code Online (Sandbox Code Playgroud)
实际的循环要大得多。我正在删除大约 200 个变量。
问题是有些变量会随着时间的推移而改变名称,或者在几年后消失。添加了其他变量。因此,一旦找不到变量,循环就会停止。这是因为dropStata 中的命令停止了。然而,该命令没有选择强制其继续进行。
我怎样才能实现我的目标?我不想手动检查每个数据集。
help capture
你可以直接放在capture前面drop。您可以继续,但更好的方法是标记哪些数据集失败。
在此示例代码中,我假设save, replace如果您drop什么都不做,则没有任何意义。基本思想是命令失败会导致在_rc. 如果发生故障,则该值为正(真),否则为零(假)。
更复杂的过程是循环相关变量并标记未找到的特定变量。
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
capture drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
if _rc {
noisily di "Note: failure for `var'indresp.data"
}
else save `var'indresp.dta, replace
}
Run Code Online (Sandbox Code Playgroud)
另请参阅Stata 是否有类似于 Java 的“try and catch”机制?
编辑:
如果您想要drop任何存在的东西,那么这应该足以解决您的问题。
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
capture drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
if _rc {
di "Note: problem for `var'indresp.data"
checkdrop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3
}
save `var'indresp.dta, replace
}
Run Code Online (Sandbox Code Playgroud)
哪里checkdrop有类似的东西
*! 1.0.0 NJC 1 April 2016
program checkdrop
version 8.2
foreach v of local 0 {
capture confirm var `v'
if _rc == 0 {
local droplist `droplist' `v'
}
else local badlist `badlist' `v'
}
if "`badlist'" != "" {
di _n "{p}{txt}variables not found: {res}`badlist'{p_end}"
}
if "`droplist'" != "" {
drop `droplist'
}
end
Run Code Online (Sandbox Code Playgroud)