forval和varlist循环错误

时间:2016-05-30 14:28:12

标签: loops stata

我有一个Excel文件,在C到BQ列(1950年至2016年)中有多年。我是通过import excel阅读的,并且数据集为ABQCBQ为年。

我想通过以下循环将C重命名为BQ_1950_2016,但似乎有错误。

forval  i=1950/2016 {
    foreach x of varlist C-BQ {
        rename `x' _`i+1'
    }
}   

C被重命名为_1950,但Stata会抛出:

  

变量_1950已定义

2 个答案:

答案 0 :(得分:2)

您不需要循环:请参阅help rename group了解技巧。在您的情况下,这是一个简化的例子。

. ds
A  B  C  D  E

. 
. rename (C-E) _#, addnumber(1950)

. 
. ds
A      B      _1950  _1951  _1952

. 

你的双循环示例出错的地方是最里面的循环和最外面的循环不会串联递增。

 . forval  i=1950/1952 {
  2. foreach x of varlist C-E {
  3. 
. display `" rename `x' _`i+1' "'
  4. 
.     }
  5. }   
 rename C _1950 
 rename D _1950 
 rename E _1950 
 rename C _1951 
 rename D _1951 
 rename E _1951 
 rename C _1952 
 rename D _1952 
 rename E _1952 

答案 1 :(得分:1)

这里有两个问题。您需要一个循环,并且用于递增本地宏的语法是非常错误的。

语法

`i+1' 

不等于本地宏i加1的值。

试一试:

. local i = 42

. di "`i+1'"
42

发生的事情是,Stata将宏引用中的+1忽略为尾随垃圾,但它确实显示了宏i中的内容:它可以理解为那个参考。此处适用的规则是+不能成为合法宏名称的一部分。

您可以执行此操作以获取本地宏,添加1并显示结果:

. di "`=`i'+1'"
43

请参阅macro的帮助。

正如William Lisowski指出的那样,rename将在没有显式循环的情况下为您重命名。

但是,如果您不知道,或者您使用的是Stata版本支持循环而不是Stata 12中引入的额外rename设施,您将如何循环?这是一种方式:

local i = 1950 
foreach x of varlist C-BQ {
    rename `x' _`i'
    local ++i 
}

在Stata 12之前执行此操作的另一种方法是使用 Stata Journal

中的renvars
renvars C-BQ \ _1950-_2016 

renvars需要Stata 8。当然,在表面下面,它正在对旧变量和新变量名执行循环。