让Stata命令" drop"即使找不到变量也要继续

时间:2016-04-01 09:21:25

标签: loops foreach stata

我有一组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命令停止了。然而,该命令无法强迫它继续下去。

我如何实现目标?我不想手动遍历每个数据集。

1 个答案:

答案 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