我有一个Excel文件,在C到BQ列(1950年至2016年)中有多年。我是通过import excel
阅读的,并且数据集为A
到BQ
,C
到BQ
为年。
我想通过以下循环将C
重命名为BQ
至_1950
至_2016
,但似乎有错误。
forval i=1950/2016 {
foreach x of varlist C-BQ {
rename `x' _`i+1'
}
}
C
被重命名为_1950
,但Stata会抛出:
变量_1950已定义
答案 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。当然,在表面下面,它正在对旧变量和新变量名执行循环。