如何运行多元foreach循环

时间:2018-10-19 09:59:56

标签: stata

我想在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,依此类推。

有没有办法做到这一点?

3 个答案:

答案 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分解为单独的参数123等,然后使用计数器局部宏遍历它们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'
}