Храните список переменных, когда некоторые переменные не существуют - PullRequest
0 голосов
/ 14 мая 2018

Для нескольких стран у меня есть один набор данных, и я хочу сохранить список переменных (указанных в глобальном 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 голосов
/ 14 мая 2018

Это упражнение по поиску пересечений различных списков имен.

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 
} 

Обратите внимание, что зацикливание имен абсолютно не нужно.

0 голосов
/ 14 мая 2018

Основная проблема с вашим кодом состоит в том, что вы не вызываете каждый набор данных для его изменения соответствующим образом.

Следующее должно дать вам то, что вы хотите:

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.

...