按索引引用宏值

Referencing macro values by index

我将下面的宏定义为变量 idvar1var2 的级别:

levelsof id, local(id_lev) sep(,)
levelsof var1, local(var1_lev) sep(,)
levelsof var2, local(var2_lev) sep(,)

我希望能够在 foreachforval 循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行。

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

. di `id_lev'[1]
0524062407240824092601260226032604 invalid name
r(198);

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

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 循环,我试图同时访问两个变量的宏索引值。

具体来说,我想同时调用 var1var2 的第一个、第二个、...、最后一个元素,这样我就可以在循环中使用这些元素来生成一个新的多变的。我如何调整 William 建议的 forval 循环来完成此操作?


更新二:

我能够修改下面 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:         .
.