Tabulate multiple variables with common prefix using a local macro

旧街凉风 提交于 2019-12-04 23:29:51

问题


I have a number of variables whose name begins with the prefix indoor. What comes after indoor is not numeric (that would make everything simpler).

I would like a tabulation for each of these variables.

My code is the following:

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

The problem is that indoor in the foreach command resolves to indoor* and not to the list of the indoor questions, as I hoped. For this reason, the tab command is followed by too many variables (it can only handle two) and this results in an error.

The simple fix is to substitute the first command with:

local indoor <full list of indoor questions>

But this is what I would like to avoid, that is to have to find all the names for these variables and then paste them in the code. It seems there is a quicker fix for this but I can't think of any.


回答1:


You could do this with

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



回答2:


The trick is to use ds or unab to create the varlist expansion before asking Stata to loop over values in the foreach loop.

Here's an example of each:

    ******************! 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 TO CREATE YOUR VARLIST FOR THE foreach LOOP:

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

    local n  0
    foreach i of local indoorvars {

**LET'S CLEAN UP YOUR TABLES A BIT WITH SOME HEADERS VIA display

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

**YOUR tab TABLES

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

OR using unab instead:

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

The advantages of ds come into play if you want to select your indoor vars using a tricky selection rule, like selecting indoor vars based on information in the variable label or some other characteristic.




回答3:


This would work. It is almost identical to the code in the question.

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



回答4:


This question has two parts:

1. How to assign multiple variable names to a local macro

As others have noted, the obvious choice here is the use of the commands ds and unab:

ds indoor*

unab indoor : indoor*

2. How to automate the tabulation of variables sharing a common prefix

For this part, the simplest and most 'valid' loop syntax in the context of Stata is in fact the one proposed by @Vadim (and which was down-voted):

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

Undoubtedly, one could mix the two approaches but in this case it is just needless and inefficient.




回答5:


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


来源:https://stackoverflow.com/questions/3701823/tabulate-multiple-variables-with-common-prefix-using-a-local-macro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!