即使未找到变量,也使 Stata 命令“drop”继续

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 中的命令停止了。然而,该命令没有选择强制其继续进行。

我怎样才能实现我的目标?我不想手动检查每个数据集。

Nic*_*Cox 5

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)