在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
。)
另请注意,我无法在最后添加0
。由于Y20
和Y200
值,10
获取11
。
是否有解决办法或显而易见的事情?
答案 0 :(得分:4)
另一种解决方法是
forval y = 5/11 {
local Y : di %02.0f `y'
<code using local Y, which must be treated as a string>
}
中间线可以基于
`: di %02.0f `y''
这样可以避免使用另一个宏,但代价是使代码更加神秘。
我在这里利用了foreach
这样一个简单的numlist可用forvalues
替换的额外事实。
这里的主要技巧是here。这个技巧避免了5/9
与10/11
不同的轻微尴尬。
请注意。要了解正在发生的事情,通常会在非常简单的示例上以交互方式使用display
。这里的细节是Stata在提供数字时对于引导零而言非常无动于衷。通常这对你来说并不重要,或者确实是一个特征,因为当你意识到Stata并没有坚持对于小于1的数字的前导零。
. di 05
5
. di 0.3
.3
. di .3
.3
这里我们确实需要前导零,而艺术是看到问题是字符串操作之一,"08"
之类的字符串恰好包含数字字符。同意只有在理解时这才是显而易见的。
答案 1 :(得分:3)
这可能是一个更好的解决方案,但这就是这个问题:
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
构建的其余部分。将所有内容放在local
中,最后在循环中使用它。
正如您所说,代码的问题在于Stata会在给出5
后阅读05
,如果您已经告知它是一个数字(使用{{1}在循环中。)
答案 2 :(得分:3)
另一个解决方案是使用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'
}