2016-04-01 37 views
2

我有一套18個Stata的數據文件(每年一次),他們的名字是:讓Stata的命令「滴」繼續即使沒有找到變量

{aindresp.dta, bindresp.dta, ... , rindresp.dta} 

我想消除每個數據集的一些變量。爲此,我想使用跨數據集的許多變量具有相同名稱以及數據集前綴(a,b,c,... r)給出的前綴的事實。例如,可變rach12被稱爲在數據集aindresp.dtaarach12,等。因此,清潔每個數據集,我運行一個循環如下所示:

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命令停止。然而,這個命令無法迫使它繼續下去。

我該如何實現目標?我不想手動通過每個數據集。

回答

4

help capture

你可以把capturedrop的前面。你可以繼續前進,但更好的是標記哪些數據集失敗。

在這個示例代碼中,我推測如果您沒有drop任何東西,則沒有指向save, replace。基本思想是在命令失敗的情況下,可以在_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 
} 

又見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 
+0

嗯,使用'capture'繼續迭代,如果命令失敗(如文章的標題)。和我以前的標題一樣,我的目標是即使沒有找到一個變量,drop命令也會繼續下降。或者,我必須爲每個單獨的變量寫一個drop,就像你所建議的那樣。是否沒有用戶編寫的命令在命令行中刪除所有找到的變量? – luchonacho

+0

如果出現問題,我沒有在你的問題中確切地看到你想要做什麼。標題只是「繼續循環」。但如果答案是「下降」,那麼這是一個簡單的程序。我會在上面編輯。 –

+0

太棒了!我對Stata代碼不是非常瞭解,但是您的程序是在每個循環中臨時刪除變量**嗎? – luchonacho