Цикл по многим переменным с одинаковым префиксом в имени - PullRequest
0 голосов
/ 16 октября 2019

У меня много переменных, начинающихся с одного и того же префикса grado.

Я хотел бы сохранить наблюдение, когда хотя бы одна из этих переменных равна определенному значению, скажем, 4. Элементы переменных grado* являются байтами.

Я создал локальный элемент и зациклил его элементы для создания фиктивного значения 1, когда хотя бы одна из grado* переменных равна 4. Однако, хотя это работает без ошибок, оно не меняет значение моего манекена на 1, когда условие выполнено, поэтому в принципе ничего не происходит.

См. Ниже код, который я использовал:

local A grado*
generate dummy = 0

foreach y of local A{
    replace dummy = 1 if `y' ==4
}

Мои входные данные выглядят так:

col1 grado1 grado2
 3     6      4
 4     4      4
 2     4      8      
 4     7      2

Я хотел бы получить следующий вывод:

col1 grado1 grado2 dummy
 3     6      4      1
 4     4      4      1
 2     4      8      1
 4     7      2      0

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Я удивлен утверждением, что это работает без ошибок, так как ваш код недопустим. Как показывает расширенный пример,

clear 
input grado1 grado2 
0 4 
1 1 
end 

local A grado*
generate dummy = 0

foreach y of local A { 
    display "`y'" 
    replace dummy = 1 if `y' == 4
}

ваш цикл представляет собой цикл над одним элементом grado* - поскольку помещение подстановочного знака в local не распаковывает подстановочный знак. Таким образом, соответствующая часть кода становится

if grado* == 4 

, которая выдает сообщение об ошибке. Я могу только догадываться, что ты сделал что-то другое.

Обратите внимание, что это работает

gen dummy = 0

foreach y of varlist grado* { 
    display "`y'" 
    replace dummy = 1 if `y' == 4
}

, как и этот однострочный

egen wanted = anymatch(grado*), value(4)
1 голос
/ 17 октября 2019

Пожалуйста, посмотрите подробнее на структуру foreach циклов и локальных макросов:

local A grado*

foreach y of varlist `A' {
    replace dummy = 1 if `y' == 4
}
...