Как запустить многомерный цикл foreach - PullRequest
0 голосов
/ 19 октября 2018

Я хотел бы запустить многомерный цикл в 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 голосов
/ 19 октября 2018

Вам вообще не нужен цикл, поскольку

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 обрабатывается как стек: каждый раз, когда вокруг цикла мы снимаем верхний элементи не заменяйте его.

0 голосов
/ 20 октября 2018

Одним из возможных решений, конечно, не самым элегантным, является использование расширенной макрофункции 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'
} 
0 голосов
/ 19 октября 2018

Рассмотрим следующий игрушечный пример:

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')
...