使用本地宏将具有公共前缀的多个变量制表

时间:2010-09-13 15:24:02

标签: loops stata stata-macros

我有许多名称以前缀indoor开头的变量。 indoor之后的内容不是数字(这会使一切变得更简单)。

我想为每个变量制作一个表格。

我的代码如下:

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

问题在于indoor命令中的foreach解析为indoor*而不是indoor问题列表,正如我所希望的那样。出于这个原因,tab命令后面跟着太多变量(它只能处理两个),这会导致错误。

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

local indoor <full list of indoor questions>

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

5 个答案:

答案 0 :(得分:8)

诀窍是在要求Stata循环ds循环中的值之前,使用unabforeach创建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*

**使用ds创建foreach循环的变量:

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

    local n  0
    foreach i of local indoorvars {

**让我们通过display

清理您的表格与某些标题
    local ++n
    di in red "--------------------------------------------"
    di in red "Table `n':  `:var l `i'' by `:var l group'"
    di in red "--------------------------------------------"

** tab表格

    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 :(得分:2)

这样可行。它与问题中的代码几乎完全相同。

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

答案 2 :(得分:1)

您可以使用

执行此操作
foreach i of var `indoor' {
   tab `i' group, col freq exact chi2
}

答案 3 :(得分:1)

这个问题分为两部分:

<强> 1。如何将多个变量名称分配给本地宏

正如其他人所说,这里显而易见的选择是使用命令dsunab

ds indoor*

unab indoor : indoor*

<强> 2。如何自动化共享共同前缀的变量列表

对于这一部分,Stata上下文中最简单,最“有效”的循环语法实际上是@Vadim提出的一种语法(并且被下调):

foreach var of varlist indoor* {  
    tab `var' group, col freq exact chi2  
}

毫无疑问,人们可以混合使用这两种方法,但在这种情况下,它只是不必要且效率低下。

答案 4 :(得分:0)

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