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

tt1*_*977 6 loops stata stata-macros

我有许多名称以前缀开头的变量indoor.接下来的indoor不是数字(这会使一切变得更简单).

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

我的代码如下:

local indoor indoor*  
foreach i of local indoor {  
    tab `i' group, col freq exact chi2  
}
Run Code Online (Sandbox Code Playgroud)

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

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

local indoor <full list of indoor questions>
Run Code Online (Sandbox Code Playgroud)

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

eri*_*oth 8

诀窍是在要求Stata循环遍历循环中的值之前使用dsunab创建varlist扩展foreach.

以下是每个例子:

    ******************! 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*
Run Code Online (Sandbox Code Playgroud)

**ds用于为foreach循环创建变量列表:

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

    local n  0
    foreach i of local indoorvars {
Run Code Online (Sandbox Code Playgroud)

**让我们清理你的表格与一些标题通过VIA display

    local ++n
    di in red "--------------------------------------------"
    di in red "Table `n':  `:var l `i'' by `:var l group'"
    di in red "--------------------------------------------"
Run Code Online (Sandbox Code Playgroud)

**你的tab表格

    tab `i' group, col freq chi2 exact nolog nokey
    }
    ******************! END EXAMPLE
Run Code Online (Sandbox Code Playgroud)

或使用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
Run Code Online (Sandbox Code Playgroud)

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


小智 1

你可以这样做

foreach i of var `indoor' {
   tab `i' group, col freq exact chi2
}
Run Code Online (Sandbox Code Playgroud)

  • 这有点混淆了 -foreach- 的语法。帮助手册表明您要使用“foreach i of varlist var1 var2”,其中 var1 和 var2 是变量,或者使用“foreach i of local Interior”,而不是像上面的示例那样将它们组合起来。然而,在这个例子中,如果你在本地 `indoor' 中有一个列表不遵守 -varlist- 中的变量命名规则,那么“foreach i of var `indoor'”中的 varlist 扩展将会失败并使用户感到困惑。 (5认同)