Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops forval和varlist循环错误_Loops_Stata - Fatal编程技术网

Loops forval和varlist循环错误

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已定义 您

我有一个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已定义


您不需要循环:请参阅
帮助重命名组
,了解相关技术。在你的例子中,这里有一个简化的例子

. 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尝试递增为何无效的说明,请参阅我的答案。