foreach使用数字的numlist和前导0

时间:2015-02-04 21:15:56

标签: loops for-loop stata

在Stata中,我正在尝试使用foreach循环来循环数字,例如05 - 11。问题是我希望将0作为价值的一部分。我需要这样做,因为0出现在变量名称中。例如,我可能有名为Y2005Y2006Var05Var06等变量。以下是我尝试过的代码示例:

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

这给了我一个错误,例如找不到Y205。 (我认为正在发生的事情是将05视为5。)

另请注意,我无法在最后添加0。由于Y20Y200值,10获取11

是否有解决办法或显而易见的事情?

3 个答案:

答案 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/910/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'
}