【问题标题】:Tabulate multiple variables with common prefix using a local macro使用本地宏将具有公共前缀的多个变量制表
【发布时间】:2025-12-11 18:25:01
【问题描述】:

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

我想要每个变量的表格。

我的代码如下:

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

问题是foreach 命令中的indoor 解析为indoor* 而不是indoor 问题列表,正如我所希望的。因此,tab 命令后面的变量太多(只能处理两个),导致错误。

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

local indoor <full list of indoor questions>

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

【问题讨论】:

    标签: loops stata stata-macros


    【解决方案1】:

    诀窍是使用dsunab 创建varlist 扩展,然后让Stata 循环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*
    

    **使用dsforeach 循环创建您的变量列表:

        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 的优势在您想使用棘手的选择规则选择室内变量时发挥作用,例如根据变量标签中的信息或其他特征选择室内变量。

    【讨论】:

      【解决方案2】:

      你可以这样做

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

      【讨论】:

      • 这有点混淆了 -foreach- 的语法。帮助手册表明您要使用“foreach i of varlist var1 var2”,其中 var1 和 var2 是变量,或者使用“foreach i of local urban”,而不是像上面的示例中那样组合它们。这在本例中有效,但是,如果您在本地有一个列表 indoor' that did not adhere to the rules of naming variables in a -varlist-, then varlist expansion in "foreach i of var indoor'" 将失败并让用户感到困惑。
      • 还不错,只要你明白Stata在执行命令之前解包了一个本地/全局宏。
      【解决方案3】:

      这会奏效。它几乎与问题中的代码相同。

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

      【讨论】:

        【解决方案4】:
        foreach v of varlist indoo* {
        do sth with `v'
        }
        

        【讨论】: