Я хочу создать цикл, который создает фиктивные переменные и называет их из списка имен переменных, а затем останавливается, как только все имена переменных повторяются один раз.
Моя попытка:
gen c = 0
foreach x of varlist stchpr01-stchpr11{
foreach i in teacher_late teacher_absent teacher_skip teacher_bully teacher_harass_teachers teacher_harass_pupils teacher_language teacher_drugs teacher_alcohol teacher_health teacher_conflict{
while c < 11{
gen `i' = 0
replace `i' = 1 if `x' == 2 | `x' == 3
replace `i' = 0 if `x' == 1
replace `i' = . if missing(`x')
replace c = c+1
}
}
}
Я чувствую, что вы путаетесь между
локальные макросы и переменные в смысле Stata (хотя механизм c
является законным, локальные макросы лучше использовать в качестве счетчиков, за исключением того, что они вам вообще не нужны)
generate
и replace
, когда вы пытаетесь generate
переменные, которые уже существуют
параллельные циклы, которые не являются вложенными циклами
Что немного неясно (для меня), это именно то, что вы хотите сделать.
Я так понимаю, это то, что вы хотите.
У вас есть 11 существующих переменных.
Вам нужно 11 соответствующих новых переменных, каждая из которых должна быть индикатором 1, если соответствующая существующая переменная равна 2 или 3, 0, если она равна 1, и отсутствовать в противном случае.
Если да, то это набросок кода. NB: это всего лишь одна петля.
local newvars teacher_late teacher_absent teacher_skip teacher_bully teacher_harass_teachers teacher_harass_pupils teacher_language teacher_drugs teacher_alcohol teacher_health teacher_conflict
foreach x of varlist stchpr01-stchpr11 {
gettoken new newvars : newvars
gen `new' = cond(`x' == 2 | `x' == 3, 1, cond(`x' == 1, 0, .))
}
См. также https://journals.sagepub.com/doi/pdf/10.1177/1536867X211063415