Исправлена ​​ошибка «переменная z_ уже определена» в цикле - PullRequest
0 голосов
/ 20 ноября 2018

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

После выполнения этой части мои 901 файлы имеют следующую структуру:

 v1 v2  v3  v4  v5  ...
    id  798 578 948 421
    2000    4567    8673    4806    9405    
    2001    5867    9001    5893    8790
    2002    6878    9233    5712    7678
    ...

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

ds v*
local i 0 
foreach var in `r(varlist)' { 
    local ++i   
    tostring v`i', replace 
    local varname = strtoname(v`i'[1]) 
    rename v`i'  z`varname'
}

Однако я получаю это сообщение об ошибке:

«переменная z_ уже определена».

Я выполнил команду set trace on, чтобы убедиться, что проблема связана с командой rename (поскольку z_ уже не может быть определено). Проблема действительно с этой командой. Тот же код прекрасно работал раньше с другой группой файлов, поэтому я не понимаю.

Я хочу, чтобы мой код занял первую строку, добавил z_ в качестве префикса к числу в первой строке и переименовал мои переменные (zid для v1, z_798 для v3, z_578 для v3 и т. Д.).


EDIT:

Кажется, что проблема будет в одном конкретном файле:

v1  v2  v3  v4  v5   …
Id  576 .   568 .   …
2000    5958    937 949 161
2001    8471    1059    767 234
…

v3 станет z_, а v5 станет также z_, но не может, так как переменная z_ уже определена. Кажется, что некоторые id номера отсутствуют.

Есть предложения по исправлению кода / данных?

1 Ответ

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

Если у вас пропущены значения, вы можете сделать следующее:

clear 

input str10(v1 v2  v3  v4  v5)
    id  798 . 948 .
    2000    4567    8673    4806    9405    
    2001    5867    9001    5893    8790
    2002    6878    9233    5712    7678
end

ds v*
local i 0 
foreach var in `r(varlist)' { 
    local ++i   
    local varname = strtoname(v`i'[1]) 
    if "`varname'" == "_" local varname `i'
    rename v`i'  z`varname'
}

list

     +------------------------------------+
     |  zid   z_798     z3   z_948     z5 |
     |------------------------------------|
  1. |   id     798      .     948      . |
  2. | 2000    4567   8673    4806   9405 |
  3. | 2001    5867   9001    5893   8790 |
  4. | 2002    6878   9233    5712   7678 |
     +------------------------------------+

По сути, вы заменяете пропущенное значение значением из счетчика i.

...