For loop 按索引引用宏值

For loop 按索引引用宏值,for-loop,indexing,foreach,stata,stata-macros,For Loop,Indexing,Foreach,Stata,Stata Macros,我在下面将宏定义为变量id、var1和var2的级别: levelsof id, local(id_lev) sep(,) levelsof var1, local(var1_lev) sep(,) levelsof var2, local(var2_lev) sep(,) 我希望能够在foreach和forval循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行 当我尝试访问上述任何宏的单个元素时,将显示宏的每个元素。例如,如果Idisplayid_le

我在下面将宏定义为变量
id
var1
var2
的级别:

levelsof id, local(id_lev) sep(,)
levelsof var1, local(var1_lev) sep(,)
levelsof var2, local(var2_lev) sep(,)
我希望能够在
foreach
forval
循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行

当我尝试访问上述任何宏的单个元素时,将显示宏的每个元素。例如,如果I
display
id_lev的第一个元素,则每个元素都显示为单个元素(最后一个元素被列为无效名称,我不理解):

此外,如果我尝试引用循环中任何宏的元素(下面给出了我尝试引用的示例),我会收到一个错误,即级别列表的第三个值是无效数字

foreach i of numlist 1/10 {
    whatever `var1'[i] `var2'[i], gen(newvar)
}

forval i = 1/10 {
    local var1_ `: word `i' of `var1''
    local var2_ `: word `i' of `var2''
    whatever `var1_' `var2_', gen(newvar)
}
不能通过宏的索引引用宏的元素吗

或者我引用的索引值不正确


更新1:

我已经做了所有的工作(谢谢),除了修改William对我上面的循环的回答中给出的
forval
循环外,我正在尝试访问相同索引值的两个变量的宏

具体来说,我想同时调用
var1
var2
的第一个、第二个、…、最后一个元素,这样我就可以使用循环中的元素来生成一个新变量。我如何调整William建议的
forval
循环来实现这一点


更新2:

我能够修改下面William给出的代码来创建功能循环:

levelsof id, clean local(id_lev)
macro list _id_lev
local nid_lev : word count `id_lev'

levelsof var1, local(var1_lev)
macro list _var1_lev
local nvar1_lev : word count `var1_lev'

levelsof var2, local(var2_lev)
macro list _var2_lev
local nvar2_lev : word count `var2_lev'

forval i = 1/`nid_lev' {

    local id : word `i' of `id_lev'
    macro list _id
    local v1 : word `i' of `var1_lev'
    macro list _v1
    local v2 : word `i' of `var2_lev'
    macro list _v2

    whatever `v1' `v2', gen(newvar)

}

正如我在上一个问题的结束语中所提到的,仔细研究Stata用户指南PDF第18.3节,您将受益匪浅

sysuse auto, clear
tab rep78, missing
levelsof rep78, missing local(replvl)
macro list _replvl
local numlvl : word count `replvl'
macro list _numlvl
forval i = 1/`numlvl' {
    local level : word `i' of `replvl'
    macro list _level
    display `level'+1000
}
屈服

. sysuse auto, clear
(1978 Automobile Data)

. tab rep78, missing

     Repair |
Record 1978 |      Freq.     Percent        Cum.
------------+-----------------------------------
          1 |          2        2.70        2.70
          2 |          8       10.81       13.51
          3 |         30       40.54       54.05
          4 |         18       24.32       78.38
          5 |         11       14.86       93.24
          . |          5        6.76      100.00
------------+-----------------------------------
      Total |         74      100.00

. levelsof rep78, missing local(replvl)
1 2 3 4 5 .

. macro list _replvl
_replvl:        1 2 3 4 5 .

. local numlvl : word count `replvl'

. macro list _numlvl
_numlvl:        6

. forval i = 1/`numlvl' {
  2.     local level : word `i' of `replvl'
  3.         macro list _level
  4.         display `level'+1000
  5. }
_level:         1
1001
_level:         2
1002
_level:         3
1003
_level:         4
1004
_level:         5
1005
_level:         .
.

谢谢你的帮助@WilliamLisowski。在底部包含的
forval
循环之前,我已经准备好了所有工作。它在您给出的示例中运行良好,但我试图同时在两个宏上完成一个循环。这就是为什么我最初的想法是将宏视为一个索引向量,我可以通过同时调用
var1
var2
的第一、第二、…,元素来引用它。我已经更新了我的上述尝试,但无法使语法正常工作。我还可以提出一个新问题,因为这特别涉及循环,如果这样更合适的话。宏是包含单个值的单个实体。它们不是向量或数组,因此索引引用毫无意义。
display
命令中的
[1]
产生错误消息。命令显示宏内容,然后对尾随的
[1]
感到困惑,因为它不是一个名称。我们需要一个可复制的示例,我们需要知道您要创建的变量。几乎可以肯定的是,有一种更直接的方法来创建它,即使用宏或循环。坚持在
levelsof
中用逗号分隔会使解析宏变得更加困难,因为Stata中的“单词”是那些用空格分隔的项目。这可能至少是循环问题的一部分。代码将在循环中第二次失败,因为
newvar
已经存在。--除非无法解释的程序
破坏了该变量。因此,您没有呈现功能代码。
. sysuse auto, clear
(1978 Automobile Data)

. tab rep78, missing

     Repair |
Record 1978 |      Freq.     Percent        Cum.
------------+-----------------------------------
          1 |          2        2.70        2.70
          2 |          8       10.81       13.51
          3 |         30       40.54       54.05
          4 |         18       24.32       78.38
          5 |         11       14.86       93.24
          . |          5        6.76      100.00
------------+-----------------------------------
      Total |         74      100.00

. levelsof rep78, missing local(replvl)
1 2 3 4 5 .

. macro list _replvl
_replvl:        1 2 3 4 5 .

. local numlvl : word count `replvl'

. macro list _numlvl
_numlvl:        6

. forval i = 1/`numlvl' {
  2.     local level : word `i' of `replvl'
  3.         macro list _level
  4.         display `level'+1000
  5. }
_level:         1
1001
_level:         2
1002
_level:         3
1003
_level:         4
1004
_level:         5
1005
_level:         .
.