Loops foreach使用带前导0的数字的numlist
在Stata中,我试图使用一个Loops foreach使用带前导0的数字的numlist,loops,for-loop,stata,Loops,For Loop,Stata,在Stata中,我试图使用一个foreach循环,在这里我循环来自的数字,比如说,05-11。问题是我希望保留0作为值的一部分。我需要这样做,因为0以变量名显示。例如,我可能有名为Y2005、Y2006、Var05、Var06等变量。下面是我尝试的代码示例: foreach year of numlist 05/09 { ...do stuff with Y20`year` or with Var`year` } 这给了我一个错误,例如找不到Y205。(我认为现在的情况是,它将05视为5
foreach
循环,在这里我循环来自的数字,比如说,05
-11
。问题是我希望保留0
作为值的一部分。我需要这样做,因为0
以变量名显示。例如,我可能有名为Y2005
、Y2006
、Var05
、Var06
等变量。下面是我尝试的代码示例:
foreach year of numlist 05/09 {
...do stuff with Y20`year` or with Var`year`
}
这给了我一个错误,例如找不到Y205
。(我认为现在的情况是,它将05
视为5
)
还请注意,由于10
和11
值,我无法在例如Y20
的末尾添加0
以获得Y200
是否有解决办法或明显的事情我没有做?可能有更好的解决方案,但这是一个解决方案:
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'
}
您可以手动插入01…09
。其余部分是使用numlist
构建的。将所有这些放在一个本地
,最后在循环中使用它
正如您所说,您的代码的问题是,如果您告诉Stata是一个数字(您在循环中使用
numlist
),则当给定05
时,Stata将读取5
。另一种解决方案是使用if
命令来计算循环值中的字符数,然后,如果需要,可以通过重新指定局部变量来添加前导零
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'
}
另一个解决方法是
forval y = 5/11 {
local Y : di %02.0f `y'
<code using local Y, which must be treated as a string>
}
因此,可以避免使用另一个宏,但代价是使代码更加神秘
在这里,我利用了一个额外的事实,即在这样一个简单的numlist上,foreach
可以替换为forvalues
这里的主要技巧是有据可查的。这个技巧避免了将5/9
与10/11
区别对待的非常轻微的尴尬
注意。为了理解正在发生的事情,在非常简单的示例上交互地使用display
,通常会有所帮助。这里的细节是,当用数字表示时,Stata很高兴地对前导零不感兴趣。通常,这对您来说并不重要,或者确实是一个特性,因为当您意识到Stata不坚持对小于1的数字使用前导零时
. di 05
5
. di 0.3
.3
. di .3
.3
在这里,我们确实需要前导零,最重要的是要看到问题在于字符串操作,像
“08”
这样的字符串恰好包含数字字符。同意只有在理解的情况下,这才是显而易见的 很好的解决方案。小缩写可能包括如果长度('year')==1
。谢谢,@Nick。我会用这个编辑我的答案。这样读起来可能也稍微容易一些。一个作业=
也是可有可无的。确实本地年份0'year'
会起作用。很好。我也会做出调整@刻痕
. di 05
5
. di 0.3
.3
. di .3
.3