当某些变量不存在时保留变量列表

Keep a list of variables when some variables don't exist

对于几个国家,我有一个数据集,我想为每个国家保留一个变量列表(在全局 vlist 中指定)。有些变量在某些国家不存在。

我想让Stata忽略这些变量的不存在,对剩下的变量执行keep命令。然而,问题是国家层面的额外 for 循环,我正在努力合并。

此问题类似于以下线程中提出的问题:

最终,我想为每个国家/地区创建一个数据集,该数据集仅包含 vlist 中指定的变量(减去 vlist 中不存在的变量)。

下面是代码,主要取自上面的线程:

clear all
set obs 5

local vlist v0 v1 v2 v3 v4 v5

foreach v of local vlist { 
    generate `v' = runiform()
}

save country1.DTA, replace
save country2.DTA, replace
save country3.DTA, replace

global vlist_example v0 v1 v6          // v6 is not part of the dataset

foreach country in country1 country2 country3 {
   local keeplist = ""
      foreach i of global vlist_example {
          capture confirm variable `i'
              if !rc {
                  local "`keeplist' `i'"
          }
      }
keep `keeplist'     
save `country'beta2.DTA, replace 

}

但是,这会产生以下错误:

rc not found
r(111);

我希望这足以说明我的问题,但如果需要更多解释,请告诉我。

你的代码的主要问题是你没有调用每个数据集来相应地修改它。

以下应该能满足您的需求:

clear all
set obs 5

local vlist v0 v1 v2 v3 v4 v5

foreach v of local vlist { 
    generate `v' = runiform()
}

save country1, replace
save country2, replace
save country3, replace

global vlist_example v0 v1 v6          // v6 is not part of the dataset

foreach country in country1 country2 country3 {
    use `country'.dta, clear
    local keeplist ""
    foreach i of global vlist_example {
        capture confirm variable `i'
        if !_rc {
            local keeplist "`keeplist' `i'"
        }
    }
    keep `keeplist'     
    save `country'beta2, replace 
}

请注意,在 capture 之后,您需要键入 !_rc 而不是 !rc.

这是一个寻找各种名称列表的交集的练习。

local wanted v0 v1 v6    

foreach set in country1 country2 country3 { 
   use `set', clear 
   describe, varlist 
   local this `r(varlist)' 
   local exist : list wanted & this 
   keep `exist'
   * save command here 
} 

请注意,绝对不需要遍历名称。