2010-09-13 12 views
5

Tengo muchas variables cuyo nombre comienza con el prefijo indoor. Lo que viene después de indoor no es numérico (eso haría todo más simple). Quiero una tabulación para cada una de estas variables. Así que escribí este código:En Stata, ¿cómo se asigna una larga lista de nombres de variables a una macro local?

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

El problema es que en el comando indoorforeach resuelve a indoor* y no a la lista de las preguntas indoor, como esperaba. Por esta razón, el comando tab es seguido por demasiadas variables (solo puede manejar dos) y esto da como resultado un error.

La solución simple es sustituir el primer comando con:

local indoor <full list of indoor questions> 

Pero esto es lo que me gustaría evitar, es decir, a tener que encontrar todos los nombres de estas variables y luego pegarlos en el código . Parece que hay una solución más rápida para esto, pero no puedo pensar en ninguna.

Respuesta

0

Se puede hacer esto con

foreach i of var `indoor' { 
    tab `i' group, col freq exact chi2 
} 
+5

Esto mezcla la sintaxis de -foreach- un poco. El manual de ayuda indica que desea usar "foreach i de varlist var1 var2" donde var1 y var2 son variables O use "foreach i of local indoor", no combinarlas como en el ejemplo anterior. Esto _ funciona_ en este ejemplo, sin embargo, si tuviera una lista en el 'interior' local que no se apegara a las reglas de nombrar variables en una -varista-, entonces la expansión varlist en "foreach i of var' indoor '"fallaría y deja al usuario confundido. –

+0

No es TAN TANTO, siempre y cuando comprenda que Stata descomprime una macro local/global antes de ejecutar el comando. – Keith

6

El truco es utilizar ds o unab para crear la expansión varlist antes de pedir Stata para recorrer los valores en el bucle foreach.

He aquí un ejemplo de cada uno:

******************! 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* 

** USAR ds para crear su VARLIST PARA LA foreach BUCLE:

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

    local n 0 
    foreach i of local indoorvars { 

** Vamos a limpiar sus tablas un poquito con algunas cabeceras VIA display

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

** YOU R tab TABLAS

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

o el uso de unab lugar:

******************! 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 

Las ventajas de ds entran en juego si quiere elegir sus VARs interiores utilizando una regla de selección difícil, al igual que la selección de VARs de interior sobre la base de la información en la etiqueta variable o alguna otra característica.

-1
foreach v of varlist indoo* { 
do sth with `v' 
} 
1

Esto funcionaría. Es casi idéntico al código en la pregunta.

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