Tabellarische mehr Variablen mit gemeinsamem Präfix ein lokales Makro
-
02-10-2019 - |
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.
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
AustauschFü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'
}