【问题标题】:How to keep a list of variables given some of them may not exist?鉴于其中一些变量可能不存在,如何保留变量列表?
【发布时间】:2013-06-12 00:39:24
【问题描述】:

我有 100 个dta 文件。我有一个变量列表,我需要 keep 并即时保存临时副本。某些变量可能存在也可能不存在于某个dta 中。

我需要 Stata 保留 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'
}

有什么办法吗?

【问题讨论】:

    标签: stata capture stata-macros


    【解决方案1】:

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

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

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

    这是更好的代码:

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

    【讨论】:

    • 感谢您的回答。但是,如果 masterlist 是:local masterlist "var1 someNonexistingVar var2",则它不起作用。我的.dta 文件不一定包含所有变量。
    • 好收获。 “存在”应该是“可变的”。现已修复。
    • 谢谢。这样可行!!!请问"This is somewhat better code:"部分...我在哪里使用它?
    • 用它替换 /*keep part*/ 下的所有内容。
    • 第三行找到masterlist变量与当前数据集中变量的交集,并将它们存储在一个名为keeplist的本地宏中。您仍然需要遍历数据集并保存新文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多