Как использовать цикл forval и учесть одно исключение? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть 900 файлы, которые включают 1,000 переменные с именами v1 - v1000 и 1 файл, который включает 43 переменные с именами v1 - v43.

Мой код в Stata первоначально открывает каждый файл, используя цикл foreach, который импортирует файлы, стирая первую строку для каждого файла (здесь не показано).

Затем я использую этот вложенный цикл forval для переименования переменных:

forval j = 1/1000 { 
    local varname = strtoname(v`j'[1])  
    rename v`j' x`varname' 
}

Этот код не работает, потому что в моем последнем файле нет переменных с именами v44 - v1000.

Мне нужен фрагмент кода, который может читать 1,000 переменные для первых 900 файлов и 43 переменные для последнего файла. Я попытался с c(k) (т.е. подсчитать количество переменных в каждом файле перед циклом):

forval j = 1/ `c(k)' {
    local varname = strtoname(v`j'[1]) 
    rename v`j'  x`varname'
}

Однако это не работает. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Очень простым, не очень элегантным способом было бы проверить, существует ли переменная с capture:

foreach dta in `allfiles' {
    use `dta', clear
    forval j = 1/1000 { 
         local varname = strtoname(v`j'[1])  
         cap confirm variable v`j'
         if (_rc == 0) rename v`j' x`varname' 
    }
    save `dta', replace
}
0 голосов
/ 14 ноября 2018

Использование некоторых искусственно созданных наборов данных:

forvalues i = 1 / 10 {
    clear
    set obs 5
    forvalues j = 1 / 10 {
        generate v`j' = rnormal()
    }
    save data`i', replace
}

use data10, clear
drop v5-v10
save data10, replace
clear

Вот пример:

local allfiles: dir . files "*.dta"

foreach dta in `allfiles' {
    use `dta', clear
    ds v*
    local i 0
    foreach var in `r(varlist)' {
        local ++i
        rename `var' x`i'
    }
    save `dta', replace
}

Ниже вы можете увидеть результаты:

use data1, clear
list
      +-----------------------------------------------------------------------------------------------------------------------+
     |        x1          x2          x3          x4          x5          x6          x7          x8          x9         x10 |
     |-----------------------------------------------------------------------------------------------------------------------|
  1. | -.0658037     1.01091    .4984255   -.1489926   -.8711151   -2.013461    .2881269    .1096137   -1.400732   -.9703687 |
  2. |  2.389028   -1.537572   -.3862164   -.6072646   -2.262745    1.315605    1.686188   -.5404406    1.078409    -.117408 |
  3. | -.2777171    .6730747   -.5674241    -.578813   -.8116008   -.5623083    .7675297   -1.117687   -1.196418     .417776 |
  4. |  2.109452   -1.035937    2.063489    1.183948   -.5243855   -1.020852   -.8674071   -.3530601   -.1752301    1.556753 |
  5. |  .7309901   -.6810378   -.9365283    1.818035    .0232499    2.533621   -.5896646    .5805199    .1430279   -1.926774 |
     +-----------------------------------------------------------------------------------------------------------------------+

use data10, clear
list

     +-----------------------------------------------+
     |        x1          x2          x3          x4 |
     |-----------------------------------------------|
  1. | -.1145661    1.830756    1.860386    .3472159 |
  2. |   1.10806   -.5629539    1.028942   -.7665766 |
  3. |  1.269463   -1.433527   -.6405479    .8663427 |
  4. |  .0158674     1.49529    2.840101   -.9815945 |
  5. |  .0969952   -.0885036   -2.036327   -.2538646 |
     +-----------------------------------------------+
...