2016-11-17 10 views
0

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

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 при назначении имен переменных.

+0

Я отредактировал локальные макроэкранные отображения (и другой текст: держите его кратким и принимайте добрую волю). Используйте отступы для отображения синтаксиса всякий раз, когда использование обратных циклов сталкивается с желанием показать литеральные обратные ссылки для локальных ссылок макросов Stata. (Существует другое решение, чтобы избежать обратных шагов, но отступы здесь легче работают.) –

ответ

2

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

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 для публикации хороших примеров кода.

+0

Ник, я не думал о формате чисел. Это отлично работает. Благодарю. Я искал решение, но не нашел его. На жалобу о переделке у меня не было никого. Он делает то, что он должен делать. Большое спасибо! – Steve

+1

Отмечено. Следует добавить, что если вы настаиваете на суффиксах с некоторыми (или всеми) ведущими нулями, вам понадобится опция 'string'' reshape' для их сохранения! –

+0

Спасибо, Ник! – Steve