How to keep a list of variables given some of them may not exist?

☆樱花仙子☆ 提交于 2019-12-23 15:27:25

问题


I have 100 dta files. I have a list of variables that I need to keep and save temporary copies on the fly. Some variables may or may not exist in a certain dta.

I need Stata to keep all variables that exist in a dta and ignore those that do not exist.

The following code has wrong syntax, but it could serve as a good pseudo code to give one a general idea of what should be done:

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'
}

Is there any way to do this?


回答1:


There are many issues with your code. Here's one way to do the inner loop.

/* 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'

The key part is that you can't foreach i of varlist phantomvar, since Stata will check the existence and error out. Similarly, putting the local name in special quotes will evaluate it, but you're trying to redefine. You may find set trace on a useful feature in debugging.

This is somewhat better code:

unab allvars: _all
local masterlist "var1 var2 phantomvar"
local keeplist: list allvars & masterlist
keep `keeplist'


来源:https://stackoverflow.com/questions/17056016/how-to-keep-a-list-of-variables-given-some-of-them-may-not-exist

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!