2010-09-13 6 views
5

Ich habe viele Variablen, deren Name mit dem Präfix indoor beginnt. Was nach indoor kommt, ist nicht numerisch (das würde alles einfacher machen). Ich möchte eine tabellarische Darstellung für jede dieser Variablen. Also schrieb ich diesen Code:In Stata wie weisen Sie einem lokalen Makro eine lange Liste von Variablennamen zu?

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

Das Problem ist, dass indoor im foreach Befehl löst zu indoor* und nicht auf die Liste der indoor Fragen, wie ich gehofft hatte. Aus diesem Grund folgen auf den Befehl tab zu viele Variablen (es können nur zwei behandelt werden) und dies führt zu einem Fehler.

Die einfache Lösung ist es, den ersten Befehl ersetzen mit:

local indoor <full list of indoor questions> 

Aber das ist, was ich möchte also vermeiden, zu haben alle Namen für diese Variablen zu finden und sie dann in den Code einfügen . Es scheint, dass es eine schnellere Lösung dafür gibt, aber ich kann mir keine vorstellen.

Antwort

0

Sie können dies tun, mit

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

Dies mischt die Syntax von -foreach- ein bisschen. Das Hilfe-Handbuch gibt an, dass Sie "foreach i von varlist var1 var2" verwenden wollen, wobei var1 und var2 Variablen sind ODER "foreach i of local indoor" verwenden, kombinieren Sie sie nicht wie im obigen Beispiel. Diese _works_ in diesem Beispiel jedoch, wenn Sie eine Liste in der lokalen "indoor", die nicht die Regeln der Benennung von Variablen in einer -Varlist-hatte, dann varlist Erweiterung in "foreach i von var' indoor "würde fehlschlagen und lassen Sie den Benutzer verwirrt. –

+0

Es ist nicht SO schlecht, solange Sie verstehen, dass Stata vor dem Ausführen des Befehls ein lokales/globales Makro entpackt. – Keith

6

Der Trick ist ds oder unab zu verwenden, um die varlist Expansion zu schaffen, bevor Stata Schleife über Werte in der foreach Schleife zu fragen.

Hier ist ein Beispiel der einzelnen:

******************! 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 NUTZEN SIE IHRE varlist FÜR DIE foreach Schleife zu erzeugen:

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

    local n 0 
    foreach i of local indoorvars { 

** LASSEN SIE IHRE Tabellen A BIT MIT ETWAS HEADERS VIA REINIGUNG display

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

** SIE R tab TABLES

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

OR mit unab statt:

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

Die Vorteile ds ins Spiel kommen, wenn Sie Ihre Innen-Vars wählen eine knifflige Auswahlregel verwendet wird, wie die Auswahl Innen Vars basierend auf Informationen in der Variablenbezeichnung oder einem anderen Merkmal.

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

Diese funktionieren würde. Es ist fast identisch mit dem Code in der Frage.

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