2015-08-05 2 views
1

У меня проблема с созданием цикла в Stata.Stata: присвоить числа в цикле

У меня есть набор данных в Stata, где я классифицировал свои наблюдения на 6 категорий с помощью переменной k10. Таким образом, k10 принимает значения 1,2,3,4,5,6. Теперь я хочу, чтобы назначить каждое наблюдение одно значение в соответствии с его классом:

value 15 for k10=1 
value 10 for k10=2 
value 8 for k10=3 
value 5 for k10=4 
value 4 for k10=5 
value 2 for k10=6 

Это легко, если я создаю новую переменную w10 и сделать это так:

gen w10 =. 
replace w10 = 15 if k10==1 
replace w10 = 10 if k10==2 
replace w10 = 8 if k10==3 
replace w10 = 5 if k10==4 
replace w10 = 4 if k10==5 
replace w10 = 2 if k10==6 

Теперь я попытался упростите код, используя цикл, к сожалению, он не делает того, чего я хочу достичь.

Мой цикл:

gen w10=. 
local A "1 2 3 4 5 6" 
local B "15 10 8 5 4 2" 
foreach y of local A { 
foreach x of local B { 
replace w10 = `x' if k10= `y' 
} 
} 

Цикл присваивает значение 2 для каждого наблюдения, хотя. Причина в том, что if-условие k10 = `y 'всегда истинно и перезаписывает замененные w10s каждый раз до конца, правильно?

Так как я могу написать цикл правильно?

ответ

2

Это действительно одна петля, а не две вложенные петли. Это ваша основная ошибка, которая является общей логикой программирования. Только последний раз, когда вы проходите через внутренний цикл, действует эффект, который длится. Попробуйте проследить за контурами, чтобы увидеть это.

В частности, в Stata, переплетение целых чисел 1/6 намного лучше сделано с помощью forval; нет необходимости вообще в указании на определение локального макроса, а затем обязывает foreach заглянуть внутрь этого макроса. Это можно связать с присвоением других значений локальным макросам с именами 1 ... 6. Здесь tokenize - выделенная команда для использования.

Попробуйте это:

gen w10 = . 
tokenize "15 10 8 5 4 2" 
quietly forval i = 1/6 { 
    replace w10 = ``i'' if k10 == `i' 
} 

Примечание кстати, что вам нужно == не = при проверке равенства.

См. (Например) this discussion.

Многие пользователи Stata хотели бы сделать это в одной строке с помощью recode. Здесь я концентрируюсь на технике петли, которая, возможно, представляет более широкий интерес.

+0

Можете ли вы также показать, как это делается путем перекодирования в одной строке? Благодаря! –

+0

Справка для 'recode' дает соответствующие примеры. –

Смежные вопросы