En Stata, estoy tratando de usar un bucle foreach donde estoy recorriendo números de, digamos, 05 - 11. El problema es que deseo mantener el 0 como parte del valor. Necesito hacer esto porque el 0 aparece en los nombres de las variables. Por ejemplo, puedo tener variables llamadas Y2005, Y2006, Var05, Var06, etc. Aquí hay un ejemplo del código que probé:

foreach year of numlist 05/09 {
   ...do stuff with Y20`year` or with Var`year`
}

Esto me da un error que, por ejemplo, Y205 no se encuentra. (Creo que lo que está sucediendo es que está tratando a 05 como 5).

También tenga en cuenta que no puedo agregar un 0 al final de p. Ej. Y20 para obtener Y200 debido a los valores 10 y 11.

¿Existe una solución alternativa o algo obvio que no estoy haciendo?

2
bill999 5 feb. 2015 a las 00:15

3 respuestas

La mejor respuesta

Otra solución alternativa es

forval y = 5/11 { 
     local Y : di %02.0f `y' 
     <code using local Y, which must be treated as a string> 
}

La línea media podría basarse en

 `: di %02.0f `y'' 

De modo que se pueda evitar el uso de otra macro, pero a costa de hacer que el código sea más críptico.

Aquí he aprovechado el hecho adicional de que foreach sobre una lista numérica tan simple se puede reemplazar con forvalues.

El truco principal aquí está documentado aquí. Este truco evita la leve incomodidad de tratar a 5/9 de manera diferente a 10/11.

Nota. Para comprender lo que está sucediendo, a menudo es útil usar display de manera interactiva en ejemplos muy simples. El detalle aquí es que Stata es felizmente indiferente a los ceros iniciales cuando se le presentan números. Por lo general, esto es indiferente para usted, o de hecho, una característica como cuando aprecia que Stata no insiste en un cero a la izquierda para números menores que 1.

. di 05
5

. di 0.3
.3

. di .3
.3

Aquí realmente necesitamos el cero a la izquierda, y el arte es ver que el problema es de manipulación de cadenas, las cadenas como "08" simplemente contienen caracteres numéricos. Estuvo de acuerdo en que esto es obvio solo cuando se comprende.

4
Nick Cox 6 feb. 2015 a las 13:44

Otra solución sería usar un comando if para contar el número de caracteres en el valor de bucle, y luego, si es necesario, puede agregar un cero a la izquierda reasignando el local.

clear    
input var2008 var2009 var2010 var2011 var2012
0 1 2 3 4
end

foreach year of numlist 08/12{
    if length("`year'") == 1 local year 0`year'
    di var20`year'
}
3
Sam Larson 5 feb. 2015 a las 17:07

Probablemente haya una solución mejor, pero así es como funciona esta:

clear
set more off

*----- example data -----

input ///
var2008 var2009 var2010 var2011 var2012
0 1 2 3 4
end

*----- what you want -----

numlist "10(1)12"
local nums 08 09 `r(numlist)'

foreach x of local nums {
    display var20`x'
}

El 01...09 se puede insertar manualmente. El resto lo construyes con numlist. Pon todo eso en un local, y finalmente úsalo en el ciclo.

Como dices, el problema con tu código es que Stata leerá 5 cuando se le dé 05, si le has dicho que es un número (lo que haces usando numlist en el ciclo) .

3
Roberto Ferrer 5 feb. 2015 a las 01:54