Search code examples
statastata-macros

Stopping at the variable before a specified variable in a varlist


I'm stuck on a tricky data management question, which I need to do in Stata. I'm using version 13.1.

I have more than 40 datasets I need to work on using a subset of variables that is different in each dataset. I can't include the data or specific analysis I'm doing for proprietary reasons but will try to include examples and code.

I have a set of datasets, A-Z. Each has a set of questions, Q1 through Q200. I need to do an analysis that includes a varlist entry on each dataset that excludes the last few questions (which deal with background info). I know this background info starts with a certain question (e.g. "MALE / FEMALE") although the actual number for that question varies by dataset.

Here's what I have done so far:

foreach X in A B C D E F {
    use `X'_YEAR.dta, clear
    lookfor "MALE/FEMALE"
    local torename = r(varlist)
    rename `torename' MF
    ANALYSIS Q1 - MF
}

That works but the problem is I'm including the variable that's actually the beginning of where I should start excluding. I know that I can save the varlist as a macro and then use the placement in the macro to exclude, for example, the seventh variable.

However, I'm stuck on taking that a step further - using this as an entry in the varlist to stop at the variable MF. Something like ANALYSIS Q1 - (MF - 1).

Does anyone know if something like that is possible?

I've searched for this issue on this site and Google and haven't found a good solution.

Apologies if this is a simple issue I've missed.


Solution

  • Here's one approach building on your code.

    . sysuse auto.dta, clear
    (1978 Automobile Data)
    
    . quiet describe, varlist
    
    . local vars `r(varlist)'
    
    . display "vars - `vars'"
    vars - make price mpg rep78 headroom trunk weight length turn displacement gear_ratio foreign
    
    . lookfor "Circle"
    
                  storage   display    value
    variable name   type    format     label      variable label
    ------------------------------------------------------------------------------------------------
    turn            int     %8.0g                 Turn Circle (ft.)
    
    . local stopvar `r(varlist)'
    
    . display "stopvar - `stopvar'"
    stopvar - turn
    
    . local myvars
    
    . foreach var in `vars' {
      2.     if "`var'" == "`stopvar'" continue, break
      3.         local myvars `myvars' `var'
      4.         }
    
    . display "myvars - `myvars'"
    myvars - make price mpg rep78 headroom trunk weight length
    

    And then just use `myvars' wherever you need the list of analysis variables. Alternatively, if your variable list always starts with Q1, you can change the local within the loop to

    local lastvar `var'
    

    and use

    Q1-`lastvar'
    

    for the list of analysis variables.