Табулирование нескольких переменных с общим префиксом с использованием локального макроса - PullRequest
6 голосов
/ 13 сентября 2010

У меня есть несколько переменных, имя которых начинается с префикса indoor. То, что следует после indoor, не является числовым (это упростит все).

Я хотел бы получить таблицу для каждой из этих переменных.

Мой код следующий:

local indoor indoor*  
foreach i of local indoor {  
    tab `i' group, col freq exact chi2  
}

Проблема в том, что indoor в команде foreach разрешается в indoor*, а не в список вопросов indoor, как я надеялся. По этой причине за командой tab следует слишком много переменных (она может обрабатывать только две), что приводит к ошибке.

Простое исправление заключается в замене первой команды на:

local indoor <full list of indoor questions>

Но это то, чего я хотел бы избежать, - это найти все имена этих переменных и затем вставить их в код. Кажется, есть более быстрое решение для этого, но я не могу думать ни о чем.

Ответы [ 5 ]

8 голосов
/ 19 сентября 2010

Хитрость заключается в том, чтобы использовать ds или unab для создания расширения varlist, прежде чем просить Stata зацикливать значения в цикле foreach.

Вот пример каждого из них:

    ******************! BEGIN EXAMPLE

** THIS FIRST SECTION SIMPLY CREATES SOME FAKE DATA & INDOOR VARS **
    clear
    set obs 10000
    local suffix `c(ALPHA)'
    token `"`suffix'"'
    while "`1'" != "" {
        g indoor`1'`2'`3' =  1+int((5-1+1)*runiform())
        lab var indoor`1'`2'`3' "Indoor Values for `1'`2'`3'"
        mac shift 1
        }
    g group = rbinomial(1,.5)
    lab var group "GROUP TYPE"

** NOW, YOU SHOULD HAVE A BUNCH OF FAKE INDOOR 
**VARS WITH ALPHA, NOT NUMERIC SUFFIXES

desc  indoor*

** ИСПОЛЬЗОВАНИЕ ds, ЧТОБЫ СОЗДАТЬ ВАШ ВАРЛИСТ ДЛЯ foreach ПЕТЛИ:

    ds indoor*
    di "`r(varlist)'"
    local indoorvars `r(varlist)'

    local n  0
    foreach i of local indoorvars {

** ДАВАЙТЕ ОЧИЩАТЬ ВАШИ СТОЛЫ С ЧАСТЬЮ С НЕКОТОРЫМИ ЗАГОЛОВКАМИ display

    local ++n
    di in red "--------------------------------------------"
    di in red "Table `n':  `:var l `i'' by `:var l group'"
    di in red "--------------------------------------------"

** ВАШИ tab СТОЛЫ

    tab `i' group, col freq chi2 exact nolog nokey
    }
    ******************! END EXAMPLE

ИЛИ используя unab вместо:

******************! BEGIN EXAMPLE
unab indoorvars: indoor*
di "`indoorvars'"

local n  0
foreach i of local indoorvars {
local ++n
di in red "--------------------------------------------"
di in red "Table `n':  `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"

tab `i' group, col freq chi2 nokey  //I turned off exact to speed things up
}

******************! END EXAMPLE

Преимущества ds вступают в игру, если вы хотите выбрать свои внутренние переменные, используя хитрое правило выбора, например, выбирая внутренние переменные, основываясь на информации в переменной переменной или какой-либо другой характеристике.

2 голосов
/ 19 октября 2011

Это будет работать.Он практически идентичен коду в вопросе.

unab indoor : indoor*
foreach i of local indoor {
  tab `i' group, col freq exact chi2
}
1 голос
/ 30 мая 2018

Этот вопрос состоит из двух частей:

1. Как назначить несколько имен переменных локальному макросу

Как уже отмечалось, очевидным выбором здесь является использование команд ds и unab:

ds indoor*

unab indoor : indoor*

2. Как автоматизировать табулирование переменных с общим префиксом

Для этой части самый простой и наиболее «допустимый» синтаксис цикла в контексте Stata на самом деле - тот, который был предложен @Vadim (и за который проголосовали):

foreach var of varlist indoor* {  
    tab `var' group, col freq exact chi2  
}

Несомненно, можно было бы смешать два подхода, но в этом случае это просто ненужно и неэффективно.

1 голос
/ 03 ноября 2010

Вы можете сделать это с

foreach i of var `indoor' {
   tab `i' group, col freq exact chi2
}
0 голосов
/ 15 октября 2011
foreach v of varlist indoo* {
do sth with `v'
}
...