Frage

habe ich eine Reihe von Variablen, deren Name mit dem Präfix indoor. Was nach indoor kommt nicht numerisch ist (das wäre alles einfacher machen).

würde ich eine tabellarische Aufstellung für jede dieser Variablen mögen.

Mein Code ist die folgende:

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

Das Problem ist, dass indoor in den foreach Befehl Entschlüssen zu indoor* und nicht auf der Liste der indoor Fragen, wie ich gehofft hatte. Aus diesem Grunde wird der tab Befehl durch zu viele Variablen, gefolgt (es kann nur zwei handhaben), 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 würde ich gerne vermeiden, dass zu haben, ist es, alle die Namen für diese Variablen zu finden und sie dann in den Code einzufügen. Es scheint, gibt es eine schnellere Lösung für dieses, aber ich kann nicht glauben, überhaupt.

War es hilfreich?

Lösung

Sie können dies tun mit

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

Andere Tipps

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*

** USE ds AUF IHRE varlist FÜR DIE foreach LOOP CREATE:

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

    local n  0
    foreach i of local indoorvars {

** LET'S BEREINIGEN Tisch EIN WENIG MIT ETWAS HEADERS VIA display

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

** IHRE tab TABLES

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

oder 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 von ds ins Spiel kommen, wenn Sie Ihre Innen-Vars mit einer kniffligen Auswahlregel auswählen möchten, wie die Auswahl Innen Vars basierend auf den Informationen in der Variablen Etikett oder eine andere Charakteristik.

Das würde funktionieren. 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
}

Diese Frage hat zwei Teile:

1. Wie mehrere Variablennamen in einem lokalen Makro

zuweisen

Wie andere erwähnt haben, hier die offensichtliche Wahl ist die Verwendung der Befehle ds und unab:

ds indoor*

unab indoor : indoor*

2. Wie die Aufstellung von Variablen automatisieren ein gemeinsamen Präfix

Austausch

Für diesen Teil, die einfachste und ‚gültig‘ Loop-Syntax im Kontext von Stata in der Tat ist die von @Vadim vorgeschlagen (und das war nach unten gestimmt):

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

Zweifellos könnte man die beiden Ansätze mischen, aber in diesem Fall ist es nur unnötig und ineffizient.

foreach v of varlist indoo* {
do sth with `v'
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top