如何保留一些变量列表可能不存在?

CHE*_*HKA 4 capture stata stata-macros

我有100个dta文件.我有一个我需要的变量列表,keep并动态保存临时副本.某些变量可能存在也可能不存在dta.

我需要Stata来保存a中存在的所有变量,dta并忽略那些不存在的变量.

下面的代码有错误的语法,但它可以作为一个很好的伪代码,让人们大致了解应该做什么:

forval j = 1/100 {
    use data`j'
    local myVarList =""

    foreach i of varlist  var1 var2 var3 var4 var5 var6 var7 var8  {
        capture sum `i'
        if _rc = 0 {
            `myVarList' = `myVarList'" "`i'
        }
    }

    keep `myVarList'
    save temporaryData`j'
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Dim*_*rov 7

您的代码存在许多问题.这是进行内循环的一种方法.

/* one fake dataset */
set obs 5
gen var1 = 1
gen var2 = 2
gen var3 = "c"
gen z    = 35

ds

/* keep part */
local masterlist "var1 var2"
local keeplist = ""

foreach i of local masterlist  {
    capture confirm variable `i'
        if !_rc {
            local keeplist "`keeplist' `i'"
        }
}

keep `keeplist'
Run Code Online (Sandbox Code Playgroud)

关键部分是你不能foreach i of varlist phantomvar,因为Stata将检查存在和错误.同样,将本地名称放在特殊引号中会对其进行评估,但您正在尝试重新定义.您可能会set trace on在调试中找到一个有用的功能.

这是更好的代码:

unab allvars: _all
local masterlist "var1 var2 phantomvar"
local keeplist: list allvars & masterlist
keep `keeplist'
Run Code Online (Sandbox Code Playgroud)