2010-09-13 44 views
5

我有许多变量,其名称以前缀indoor开头。 indoor后面的数字不是数字(这会使一切变得简单)。我想为这些变量中的每一个制表。所以我写了这个代码:在Stata中,如何将一长串变量名称分配给本地宏?

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

的问题是indoorforeach命令解析为indoor*,而不是的indoor问题清单,正如我希望的。由于这个原因,tab命令后面跟着太多的变量(它只能处理两个变量),这会导致错误。

简单的解决方法是使用来替代第一个命令:

local indoor <full list of indoor questions> 

但是,这是我想什么来避免,即必须找到这些变量的所有名称,然后将它们粘贴代码。似乎有一个更快的解决方案,但我想不出任何。

回答

0

您可以用

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

这混合了-foreach-一点的语法。帮助手册表明你想要使用“varlist var1 var2的foreach i”,其中var1和var2是变量,或者使用“foreach i of local indoor”,而不是像上面的例子那样合并它们。然而,在这个例子中,如果你在本地'indoor'中有一个不符合在-varlist-中命名变量规则的列表,那么var_external的'foreach i'中的varlist扩展将会失败并让用户感到困惑。 – 2010-12-30 05:36:45

+0

只要你理解Stata在执行命令之前解包本地/全局宏,它并不是很糟糕。 – Keith 2011-10-19 19:34:36

6

诀窍是在要求Stata循环访问foreach循环中的值之前,使用dsunab创建varlist扩展。

这里的每个的一个示例:

******************! 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创建你varlist中FOR THE foreach LOOP:

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

    local n 0 
    foreach i of local indoorvars { 

** LET'S清理表A位,且某些标头VIA display

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

**你[R tab TABLES

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

或使用unab代替:

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

ds的优势来发挥作用,如果你想用一个棘手的选择规则,如基于信息选择室内瓦尔选择您的室内瓦尔在可变标签或其他特征中。

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

这将工作做到这一点。它与问题中的代码几乎相同。

unab indoor : indoor* 
foreach i of local indoor { 
    tab `i' group, col freq exact chi2 
} 
相关问题