我有一组18个Stata数据文件(每年一个),其名称为:
{aindresp.dta, bindresp.dta, ... , rindresp.dta}
我想从每个数据集中删除一些变量。为此,我想使用这样的事实:跨数据集的许多变量具有相同的名称,加上数据集前缀(a,b,c,... r)给出的前缀。例如,变量rach12
在数据集arach12
等中被称为aindresp.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
}
实际循环要大得多。我正在删除大约200个变量。
问题是一些变量会随着时间的推移而改变名称,或者在几年后消失。添加了其他变量。因此,一旦找不到变量,循环就会停止。这是因为Stata中的drop
命令停止了。然而,该命令无法强迫它继续下去。
我如何实现目标?我不想手动遍历每个数据集。
答案 0 :(得分:4)
help capture
您可以将capture
放在drop
前面。你可以坚持下去,但更好的方法是标记哪些数据集失败。
在此示例代码中,我假设save, replace
没有任何意义,如果您没有drop
任何事情。基本思想是命令失败导致_rc
中可访问的非零错误代码。如果出现故障,这将是正的(true),否则为零(false)。
更复杂的过程是循环有关变量并标记未找到的特定变量。
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
}
另见Does Stata have any `try and catch` mechanism similar to Java?
编辑:
如果你想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
}
其中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