variabili multiple tabulare con prefisso comune utilizzando una macro locale
-
02-10-2019 - |
Domanda
Ho un certo numero di variabili il cui nome inizia con la indoor
prefisso. Quello che viene dopo indoor
non è numerico (che renderebbe tutto più semplice).
Vorrei un tabulato per ciascuna di queste variabili.
Il mio codice è il seguente:
local indoor indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
Il problema è che in indoor
il comando foreach
risolve a indoor*
e non alla lista delle domande indoor
, come speravo. Per questo motivo, il comando tab
è seguito da troppe variabili (che può gestire solo due) e questo si traduce in un errore.
La soluzione semplice è quella di sostituire il primo comando con:
local indoor <full list of indoor questions>
Ma questo è quello che vorrei evitare, che è quello di avere per trovare tutti i nomi per queste variabili e quindi incollarli nel codice. Sembra che ci sia una correzione più veloce per questo, ma non riesco a pensare di qualsiasi.
Soluzione
Si potrebbe fare questo con
foreach i of var `indoor' {
tab `i' group, col freq exact chi2
}
Altri suggerimenti
Il trucco è quello di utilizzare ds
o unab
per creare l'espansione lista-variabili prima di chiedere Stata al ciclo su valori nel ciclo foreach
.
Ecco un esempio di ciascuno:
******************! 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*
** USO ds
Per creare la lista-variabili per il loop foreach
:
ds indoor*
di "`r(varlist)'"
local indoorvars `r(varlist)'
local n 0
foreach i of local indoorvars {
** Puliamo le tabelle un po 'con alcune intestazioni VIA display
local ++n
di in red "--------------------------------------------"
di in red "Table `n': `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"
** le tabelle tab
tab `i' group, col freq chi2 exact nolog nokey
}
******************! END EXAMPLE
O usando unab
invece:
******************! 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
I vantaggi di ds
entrano in gioco se si desidera selezionare i Vars coperto utilizzando una regola di selezione difficile, come la selezione Vars interne sulla base delle informazioni in etichetta di variabile o di qualche altra caratteristica.
Questo potrebbe funzionare. E 'quasi identico al codice in questione.
unab indoor : indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
Questa domanda ha due parti:
1. Come assegnare più nomi di variabili per una macro locali
Come altri hanno notato, la scelta più ovvia è l'uso della comandi ds
e unab
:
ds indoor*
unab indoor : indoor*
2. Come automatizzare la tabulazione delle variabili che condividono un comune prefisso
Per questa parte, la piu 'valida' la sintassi del ciclo più semplice e nel contesto di Stata è infatti quella proposta da @Vadim (e che era down-votato):
foreach var of varlist indoor* {
tab `var' group, col freq exact chi2
}
Indubbiamente, si potrebbe mescolare i due approcci, ma in questo caso è solo inutile e inefficiente.
foreach v of varlist indoo* {
do sth with `v'
}