Обратите внимание, что все ваши манекены будут созданы как 1 или отсутствуют. Почти всегда полезно создавать их непосредственно как 1 или 0. Действительно, это обычное определение манекенов.
В общем, это цикл по возможностям с использованием forvalues
или foreach
, но ярлык слишком прост, чтобы не быть предпочтительным в этом случае. Рассмотрим этот воспроизводимый пример:
. sysuse auto, clear
(1978 Automobile Data)
. tab rep78, gen(rep78)
Repair |
Record 1978 | Freq. Percent Cum.
------------+-----------------------------------
1 | 2 2.90 2.90
2 | 8 11.59 14.49
3 | 30 43.48 57.97
4 | 18 26.09 84.06
5 | 11 15.94 100.00
------------+-----------------------------------
Total | 69 100.00
. d rep78?
storage display value
variable name type format label variable label
------------------------------------------------------------------------------
rep781 byte %8.0g rep78== 1.0000
rep782 byte %8.0g rep78== 2.0000
rep783 byte %8.0g rep78== 3.0000
rep784 byte %8.0g rep78== 4.0000
rep785 byte %8.0g rep78== 5.0000
Это все манекены (некоторые предпочитают говорить «показатели») одним махом через опции tabulate
.
Для полноты рассмотрите пример, сделав это методом петли. Мы представляем себе, что годы 1950-2015 представлены:
forval y = 1950/2015 {
gen byte dummy`y' = year == `y'
}
Две цифры идентификаторы dummy50
для dummy15
бы однозначен в этом примере, поэтому здесь они в качестве бонуса:
forval y = 1950/2015 {
local Y : di %02.0f mod(`y', 100)
gen byte dummy`y' = year == `y'
}
Здесь byte
является необязательной, если память очень короткая, но это хорошая практика.
Если кто-то решил написать цикл для создания индикаторов для различных значений строковой переменной, это тоже можно сделать. Вот две возможности. Отсутствие легко воспроизводимого примера в исходном сообщении, создадим песочницу. Первый метод - сначала encode
, затем цикл над отдельными числовыми значениями. Второй способ - найти прямые строковые значения, а затем перебрать их.
clear
set obs 3
gen mystring = word("frog toad newt", _n)
* Method 1
encode mystring, gen(mynumber)
su mynumber, meanonly
forval j = 1/`r(max)' {
gen dummy`j' = mynumber == `j'
label var dummy`j' "mystring == `: label (mynumber) `j''"
}
* Method 2
levelsof mystring
local j = 1
foreach level in `r(levels)' {
gen dummy2`j' = mystring == `"`level'"'
label var dummy2`j' `"mystring == `level'"'
local ++j
}
describe
Contains data
obs: 3
vars: 8
size: 96
------------------------------------------------------------------------------
storage display value
variable name type format label variable label
------------------------------------------------------------------------------
mystring str4 %9s
mynumber long %8.0g mynumber
dummy1 float %9.0g mystring == frog
dummy2 float %9.0g mystring == newt
dummy3 float %9.0g mystring == toad
dummy21 float %9.0g mystring == frog
dummy22 float %9.0g mystring == newt
dummy23 float %9.0g mystring == toad
------------------------------------------------------------------------------
Sorted by:
Как насчет манекенов для наблюдений в id? Это не цифры, и я не вижу, как приспособить forval y =? – user3285148
Вам не обязательно. 'tabulate' также охватывает этот случай, строковые переменные. В противном случае put, (1) 'tabulate' предлагает опрятное решение здесь (2), если кому-то интересно, есть и неудивительно, что решения для цикла тоже. Но я добавлю решение цикла для строковой переменной в ответ. –