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

时间:2018-05-14 11:53:08

标签: loops stata capture stata-macros

对于多个国家/地区,我有一个数据集,我想为每个数据集保留一个变量列表(在全局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);

我希望这充分描述了我的问题,但如果有什么需要更多解释,请告诉我。

2 个答案:

答案 0 :(得分:2)

您的代码的主要问题是您不会调用每个数据集来相应地修改它。

以下内容可为您提供所需内容:

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

答案 1 :(得分:1)

这是寻找各种名单的交叉点的练习。

let initials: String = string
    .split(" ")                     // create an iterator, yielding words
    .flat_map(|s| s.chars().nth(0)) // get the first char of each word
    .collect();                     // collect the result into a String

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