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.

È stato utile?

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'
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top