Pregunta

Tengo un número de variables cuyo nombre comienza con el prefijo indoor. Lo que viene después indoor no es numérico (que haría todo lo más simple).

Me gustaría una tabulación para cada una de estas variables.

Mi código es el siguiente:

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

El problema es que indoor en el resuelve comando foreach a indoor* y no a la lista de las preguntas indoor, como esperaba. Por esta razón, el comando tab es seguido por demasiadas variables (que sólo puede manejar dos) y esto resulta en un error.

La solución simple es sustituir el primer comando con:

local indoor <full list of indoor questions>

Pero esto es lo que me gustaría evitar, que es tener que encontrar todos los nombres de estas variables y luego pegarlos en el código. Parece que hay una solución rápida para esto, pero no puedo pensar en ninguna.

¿Fue útil?

Solución

Se puede hacer esto con

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

Otros consejos

El truco es utilizar ds o unab para crear la expansión varlist antes de preguntar Stata de iterar sobre valores en el bucle foreach.

Este es un ejemplo de cada uno:

    ******************! 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 utilizar para crear su VARLIST para el bucle foreach:

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

    local n  0
    foreach i of local indoorvars {

** Vamos a limpiar sus tablas un poquito con algunas cabeceras VIA display

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

** tablas tab

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

O usando unab lugar:

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

Las ventajas de ds entran en juego si quiere elegir sus VARs interiores utilizando una regla de selección difícil, al igual que la selección de VARs de interior sobre la base de la información en la etiqueta de variable o alguna otra característica.

Esto funcionaría. Es casi idéntico al código en la pregunta.

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

Esta pregunta tiene dos partes:

1. Cómo asignar varios nombres de variable en una macro locales

Como otros han señalado, la elección obvia es el uso de la ds comandos y unab:

ds indoor*

unab indoor : indoor*

2. Cómo automatizar la tabulación de las variables que comparten un prefijo común

En esta parte, la más sintaxis bucle 'válida' simple y en el contexto de Stata es de hecho la propuesta por @Vadim (y que se había reducido votó):

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

Sin duda, uno podría mezclar los dos enfoques, pero en este caso es sólo innecesaria e ineficiente.

foreach v of varlist indoo* {
do sth with `v'
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top