我想在Stata中运行一个多变量循环来重命名许多变量。
以下代码是我如何想象的:
local varlist1 "x1 x2 x3 .... xn"
local varlist2 "a b c .... n"
foreach i in local `varlist1' & j in local `varlist2' {
rename `i' `j'
}
目标是将x1
重命名为a
,将x2
重命名为b
,依此类推。
有没有办法做到这一点?
答案 0 :(得分:1)
考虑以下玩具示例:
clear
set obs 1
forvalues i = 1 / 3 {
generate x`i' = runiform()
}
list
+--------------------------------+
| x1 x2 x3 |
|--------------------------------|
1. | .3913819 .1196613 .7542434 |
+--------------------------------+
这是您想要做的一种方法:
local varlist1 "x1 x2 x3"
local varlist2 "a b c"
tokenize `varlist2'
local i 0
foreach var1 of local varlist1 {
local ++i
rename `var1' ``i''
}
list
+--------------------------------+
| a b c |
|--------------------------------|
1. | .5844658 .3697791 .8506309 |
+--------------------------------+
这里的想法是将局部宏varlist2
分解为单独的参数1
,2
,3
等,然后使用计数器局部宏遍历它们i
。
或者,您可以简单地执行以下操作:
local varlist1 "x1 x2 x3"
local varlist2 "a b c"
rename (`varlist1') (`varlist2')
或:
rename x# (`varlist2')
答案 1 :(得分:1)
您根本不需要像
这样的循环rename (x1 x2 x3 xn) (a b c n)
鉴于对新名称是否用于其他变量的某些限制,完全合法。
由于对循环感兴趣,这是另一种慢速的方法:
local new a b c n
foreach old in x1 x2 x3 xn {
gettoken this new : new
rename `old' `this'
}
这里new
被视为堆栈:每次循环时,我们都会摘掉最上面的项目,而不是替换它。
答案 2 :(得分:0)
一种可能的解决方案(当然不是最优雅的方法)是使用扩展的宏函数word i of
。一个示例解决方案是:
local varlist1 "x1 x2 x3 .... xn"
local varlist2 "a b c .... n"
local numitems = wordcount("`varlist1'")
forv i=1/`numitems' {
local old_name : word `i' of `varlist1'
local new_name : word `i' of `varlist2'
rename `old_name' `new_name'
}