2016-05-30 122 views
0

我有一个C到BQ(1950年至2016年)列C年的Excel文件。我通过import excel读取它,并且有一个数据集ABQ,CBQ是年。forval和varlist循环错误

我倒是想通过下面的循环重命名CBQ_1950_2016但似乎有错。

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

C被重命名为_1950但塔塔抛出:

变量_1950已经定义

回答

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 

+0

thx很多(对你的机器人!) –

+0

有关为什么OP的增量尝试不起作用的评论,请参阅我的答案。 –

1

这里有两个问题。你需要一个循环,增加本地宏的语法是错误的。

语法

`i+1' 

不等同于当地的宏i加1

的价值试试:

. local i = 42 

. di "`i+1'" 
42 

发生了什么事是,塔塔忽略+1内作为尾随垃圾的宏引用,但它确实显示了宏i中的内容:它可以理解该引用即这里适用的规则是+不能是合法宏名称的一部分。

你能做到这一点采取局部宏,加1,并显示结果:

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

查看帮助macro

正如William Lisowski指出的那样,rename将以任何方式为您进行重命名,而无需显式循环。

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

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

另一种方式来做到这一点的Stata 12之前是使用renvars塔塔杂志

renvars C-BQ \ _1950-_2016 

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