Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops foreach使用带前导0的数字的numlist_Loops_For Loop_Stata - Fatal编程技术网

Loops foreach使用带前导0的数字的numlist

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

在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

还请注意,由于
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