Loops forval和varlist循环错误
我有一个Excel文件,C列至BQ列中有年份(1950年至2016年)。我通过Loops forval和varlist循环错误,loops,stata,Loops,Stata,我有一个Excel文件,C列至BQ列中有年份(1950年至2016年)。我通过import excel阅读了它,并且有一个数据集a到BQ,C到BQ是年份 我想通过以下循环将C重命名为BQ重命名为\u 1950重命名为\u 2016,但似乎有误 forval i=1950/2016 { foreach x of varlist C-BQ { rename `x' _`i+1' } } C被重命名为\u 1950,但Stata抛出: 变量_1950已定义 您
import excel
阅读了它,并且有一个数据集a
到BQ
,C
到BQ
是年份
我想通过以下循环将C
重命名为BQ
重命名为\u 1950
重命名为\u 2016
,但似乎有误
forval i=1950/2016 {
foreach x of varlist C-BQ {
rename `x' _`i+1'
}
}
C
被重命名为\u 1950
,但Stata抛出:
变量_1950已定义
您不需要循环:请参阅
帮助重命名组
,了解相关技术。在你的例子中,这里有一个简化的例子
. 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
.您不需要循环:有关技术,请参阅
帮助重命名组。在你的例子中,这里有一个简化的例子
. 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
这里有两个问题。您需要一个循环,而递增本地宏的语法是非常错误的
语法
`i+1'
不等于本地宏i
的值加1
试试看:
. local i = 42
. di "`i+1'"
42
发生的情况是,Stata忽略了宏引用中作为尾部垃圾的+1
,但它确实显示了宏i
中的内容:它可以理解该引用。这里应用的规则是+
不能是合法宏名称的一部分
您可以这样做以获取本地宏,添加1,并显示结果:
. di "`=`i'+1'"
43
请参阅有关宏的帮助
正如William Lisowski指出的,rename
将以任何方式为您进行重命名,而无需显式循环
但是,如果您不知道这一点,或者如果您使用的是支持循环但不支持Stata 12中引入的额外rename
功能的Stata版本,您将如何循环?这里有一个方法:
local i = 1950
foreach x of varlist C-BQ {
rename `x' _`i'
local ++i
}
在Stata 12之前,另一种方法是使用Stata期刊上的renvars
renvars
需要Stata 8以上。当然,在表面之下,它正在旧变量和新变量名上执行循环 这里有两个问题。您需要一个循环,而递增本地宏的语法是非常错误的
语法
`i+1'
不等于本地宏i
的值加1
试试看:
. local i = 42
. di "`i+1'"
42
发生的情况是,Stata忽略了宏引用中作为尾部垃圾的+1
,但它确实显示了宏i
中的内容:它可以理解该引用。这里应用的规则是+
不能是合法宏名称的一部分
您可以这样做以获取本地宏,添加1,并显示结果:
. di "`=`i'+1'"
43
请参阅有关宏的帮助
正如William Lisowski指出的,rename
将以任何方式为您进行重命名,而无需显式循环
但是,如果您不知道这一点,或者如果您使用的是支持循环但不支持Stata 12中引入的额外rename
功能的Stata版本,您将如何循环?这里有一个方法:
local i = 1950
foreach x of varlist C-BQ {
rename `x' _`i'
local ++i
}
在Stata 12之前,另一种方法是使用Stata期刊上的renvars
renvars
需要Stata 8以上。当然,在表面之下,它正在旧变量和新变量名上执行循环 有关OP尝试递增为何无效的说明,请参阅我的答案。有关OP尝试递增为何无效的说明,请参阅我的答案。