Создание пронумерованных имен переменных с помощью команды foreach

У меня есть список переменных, для которых я хочу создать список пронумерованных переменных. Цель состоит в том, чтобы использовать их с командой reshape для создания сложенного набора данных. Как мне держать их в порядке? Например, с этим кодом

local ct = 1  
foreach x in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 {  
    gen runs`ct' = `x'  
    local ct = `ct' + 1  
}  

когда я использую команду reshape, она генерирует заказ как

runs1 runs10 runs11 ... runs2 runs22 ...   

а не желаемое

runs01 runs02 runs03 ... runs26

Сохранение порядка необходимо в этом анализе. Я пытаюсь добавить начальный ноль ко всем значениям ct меньше 10 при назначении имен переменных.


person Steve    schedule 17.11.2016    source источник
comment
Я отредактировал ваши локальные макросы (и другой текст: будьте кратки и предполагайте доброжелательность). Используйте отступы для отображения синтаксиса всякий раз, когда использование обратных кавычек противоречит желанию отображать буквальные обратные кавычки для ссылок на локальные макросы Stata. (Есть еще одно решение, чтобы избежать обратных кавычек, но здесь отступы работают проще.)   -  person Nick Cox    schedule 18.11.2016


Ответы (1)


Генерация серии идентификаторов с ведущими нулями является задокументированной и решенной проблемой: см., например. здесь.

local j = 1 
foreach v in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 { 
   local J : di %02.0f `j' 
   rename `v' runs`J' 
   local ++j 
} 

Обратите внимание, что я использовал rename, а не generate. Если вы собираетесь reshape переменные впоследствии, копировать содержимое не нужно. Действительно, тип float по умолчанию для числовых переменных, используемых generate, может при некоторых обстоятельствах привести к потере точности.

Отмечу, что может быть и решение с rename groups.

Тем не менее, трудно понять вашу жалобу на то, что reshape делает (или не делает). Если у вас есть ряд переменных, таких как runs*, наиболее очевидным reshape является reshape long и, например,

clear 
set obs 1
gen id = _n

foreach v in q61 q77 q99 q121 q143 { 
    gen `v' = 42 
} 

reshape long q, i(id) j(which) 

list 

     +-----------------+
     | id   which    q |
     |-----------------|
  1. |  1      61   42 |
  2. |  1      77   42 |
  3. |  1      99   42 |
  4. |  1     121   42 |
  5. |  1     143   42 |
     +-----------------+

отлично работает для меня; информация о порядке столбцов сохраняется, и использование rename вообще не требуется. Если я хочу сопоставить суффиксы с 1 вверх, я могу просто использовать egen, group().

Так что это трудно обсуждать без воспроизводимого примера. См. https://stackoverflow.com/help/mcve, чтобы узнать, как публиковать хорошие примеры кода.

person Nick Cox    schedule 17.11.2016
comment
Ник, я не подумал о числовом формате. Это прекрасно работает. Спасибо. Я искал решение, но не нашел. На жалобы на перепрошивку у меня не было ни одной. Он делает то, что должен делать. Большое спасибо! - person Steve; 18.11.2016
comment
Принято к сведению. Следует добавить, что если вы настаиваете на суффиксах с некоторыми (или со всеми) ведущими нулями, вам понадобится опция string для reshape, чтобы сохранить их! - person Nick Cox; 18.11.2016