在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。)
还请注意,我不能在例如Y20的末尾添加一个Y200,因为10和11值。
有什么事情是我没有做的,还是一件显而易见的事?
发布于 2015-02-05 00:28:42
另一个解决办法是
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是可以用forvalues替换的。
这里的主要技巧是文档化的这里。这个技巧避免了将5/9与10/11区别对待的非常小的尴尬。
请注意。为了了解正在发生的事情,在非常简单的示例中交互地使用display通常会有所帮助。这里的细节是,当给出数字时,Stata很高兴地对前导零漠不关心。通常,这对你来说是无关紧要的,或者实际上是一个功能,因为当你意识到Stata不坚持数字小于1的前导零的时候。
. di 05
5
. di 0.3
.3
. di .3
.3在这里,我们确实需要前导零,技术是要知道问题是字符串操作问题之一,比如"08"这样的字符串恰好包含数字字符。同意这一点只有在理解的时候才是显而易见的。
发布于 2015-02-04 21:48:31
也许有一个更好的解决方案,但这个方法是这样的:
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中,并最终在循环中使用它。
正如您所说的,如果您告诉5是一个数字(在循环中使用numlist ),那么Stata将在给定05时读取它。
发布于 2015-02-04 22:15:29
另一种解决方案是使用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'
}https://stackoverflow.com/questions/28331608
复制相似问题