首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带前导0的数字的数字列表

使用带前导0的数字的数字列表
EN

Stack Overflow用户
提问于 2015-02-04 21:15:55
回答 3查看 2.3K关注 0票数 2

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

代码语言:javascript
复制
foreach year of numlist 05/09 {
   ...do stuff with Y20`year` or with Var`year`
}

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

还请注意,我不能在例如Y20的末尾添加一个Y200,因为1011值。

有什么事情是我没有做的,还是一件显而易见的事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-05 00:28:42

另一个解决办法是

代码语言:javascript
复制
forval y = 5/11 { 
     local Y : di %02.0f `y' 
     <code using local Y, which must be treated as a string> 
}

中线可能是基于

代码语言:javascript
复制
 `: di %02.0f `y'' 

这样就可以避免使用另一个宏,但代价是使代码更加神秘。

在这里,我利用了这样一个额外的事实:在这样一个简单的数字列表上的foreach是可以用forvalues替换的。

这里的主要技巧是文档化的这里。这个技巧避免了将5/910/11区别对待的非常小的尴尬。

请注意。为了了解正在发生的事情,在非常简单的示例中交互地使用display通常会有所帮助。这里的细节是,当给出数字时,Stata很高兴地对前导零漠不关心。通常,这对你来说是无关紧要的,或者实际上是一个功能,因为当你意识到Stata不坚持数字小于1的前导零的时候。

代码语言:javascript
复制
. di 05
5

. di 0.3
.3

. di .3
.3

在这里,我们确实需要前导零,技术是要知道问题是字符串操作问题之一,比如"08"这样的字符串恰好包含数字字符。同意这一点只有在理解的时候才是显而易见的。

票数 4
EN

Stack Overflow用户

发布于 2015-02-04 21:48:31

也许有一个更好的解决方案,但这个方法是这样的:

代码语言:javascript
复制
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时读取它。

票数 3
EN

Stack Overflow用户

发布于 2015-02-04 22:15:29

另一种解决方案是使用if命令来计数循环值中的字符数,然后如果需要,可以通过重新分配本地值来添加前导零。

代码语言:javascript
复制
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'
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28331608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档