2010-09-13 6 views
5

J'ai beaucoup de variables dont le nom commence par le préfixe indoor. Ce qui vient après indoor n'est pas numérique (cela rendrait tout plus simple). Je veux une tabulation pour chacune de ces variables. J'ai donc écrit ce code:Dans Stata, comment affecter une longue liste de noms de variables à une macro locale?

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

Le problème est que indoor dans la commande foreach décide de indoor* et non à la liste des indoor questions, comme je l'espérais. Pour cette raison, la commande tab est suivie de trop de variables (elle ne peut en gérer que deux) et cela entraîne une erreur.

La solution simple est de remplacer la première commande avec:

local indoor <full list of indoor questions> 

Mais ce que je voudrais éviter, à savoir devoir trouver tous les noms de ces variables, puis de les coller dans le code . Il semble qu'il y ait une solution plus rapide pour cela, mais je ne peux pas y penser.

Répondre

0

Vous pouvez le faire avec

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

Cela mélange la syntaxe de -foreach- un peu. Le manuel d'aide indique que vous voulez utiliser "foreach i de varlist var1 var2" où var1 et var2 sont des variables OU utiliser "foreach i de local indoor", ne pas les combiner comme dans l'exemple ci-dessus. Ceci _works_ dans cet exemple, cependant, si vous aviez une liste dans le 'indoor 'local qui n'a pas adhéré aux règles de nommer des variables dans un -varlist-, alors l'expansion de varlist dans" foreach i de var 'indoor'" échouerait et laissez l'utilisateur confus. –

+0

Ce n'est pas si grave, du moment que vous comprenez que Stata décompresse une macro locale/globale avant d'exécuter la commande. – Keith

6

L'astuce consiste à utiliser ds ou unab pour créer l'extension varlist avant de demander à Stata de boucler les valeurs dans la boucle foreach.

Voici un exemple de chaque:

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

** UTILISER ds POUR CRÉER VOTRE varlist POUR LA foreach LOOP:

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

    local n 0 
    foreach i of local indoorvars { 

** Nettoyons VOS TABLES UN PEU AVEC QUELQUES TÊTES VIA display

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

** VOUS R tab TABLES

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

ou à l'aide unab à la place:

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

Les avantages de ds entrent en jeu si vous voulez sélectionner vos vars à l'intérieur en utilisant une règle de sélection délicate, comme la sélection vars intérieur à partir des informations dans l'étiquette variable ou une autre caractéristique.

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

Cela fonctionnerait. C'est presque identique au code dans la question.

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