создать список переменных из локального списка макросов (findname)

У меня есть списки переменных в локальных макросах, которые я хотел бы использовать в команде, например:

    local a int1 int2 num1 num2 bin1 bin2 ...
    local b int3 int4 bin3 num3  ...

Здесь переменные num* int* и bin* являются числовыми, целыми и двоичными соответственно.

Я хочу запустить цикл foreach по переменным в локальном a' and b', но только тем, которые имеют целочисленное значение, а именно int1, int2, int3,...

Для этого я использую команду findname, созданную Ником Коксом, для поиска переменных с целочисленным значением, сохраняя список соответствующих имен переменных в локальном макросе. Но я не хочу запускать его для всех переменных в наборе данных, а только для подмножеств переменных (обозначенных в локальных переменных a, b и т. д.), а затем использовать список в последующей команде.

Итак, для списка целочисленных переменных в локальном a' and b', являющемся локальным a_int' and b_int', я хочу использовать следующее:

    foreach var of varlist `a_int' `b_int'{
        whatever command
    }

person Makiko    schedule 26.01.2021    source источник
comment
Что ж, если foo есть в списке, вы можете создать новую переменную foo_qualifies как gen foo_qualifies = 1, которая равна 1 во всех наблюдениях. И так далее для других переменных. Я не понимаю, почему это может быть полезно сверх того, что предоставляет findname. Почему вы хотите этого?   -  person Nick Cox    schedule 26.01.2021
comment
@Makiko Какой бы вы хотели видеть переменную вашего индикатора, если у вас есть, скажем, две переменные x1 и x2 и одно наблюдение, где x1 = 1, x2 = 3,5? Я думаю, что ваш вопрос выиграет от минимального примера ваших данных вместе с желаемым результатом. См. также вики тега Stata, чтобы узнать, как лучше всего задавать вопросы.   -  person Wouter    schedule 26.01.2021


Ответы (1)


Если я вас правильно понял, вам нужно пересечение двух списков, хранящихся в локальных макросах. Для этого вы можете использовать расширенные функции макросов для управления списками: см. help macrolists.

// Setup
local a x1 x2 x3 x4 x5
local b x4 x5 x6 x7 x8
local int x2 x3 x6

// Get intersection of variable lists and integer list
local a_int : list a & int
local b_int : list b & int

// Put a_int and b_int together and drop possible duplicates
local ab_int `a_int' `b_int'
local ab_int_uniq : list uniq ab_int

// Do something
foreach var of varlist `ab_int_uniq' {
    * do something
}
person Wouter    schedule 26.01.2021