通过索引引用宏值

时间:2017-03-04 21:36:35

标签: for-loop indexing foreach stata stata-macros

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

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

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

当我尝试访问上述任何宏的单个元素时,会显示宏的每个元素。例如,如果displayid_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:

我已经完成了所有工作(谢谢),除了适应威廉回答上面循环中给出的forval循环,其中我试图以相同的索引值访问两个变量的宏

具体来说,我想同时调用var1var2的第一个,第二个,......,最后一个元素,这样我就可以使用循环中的元素来生成一个新变量。我如何调整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)

}

1 个答案:

答案 0 :(得分:2)

正如我在前一个问题的结束语中提到的那样,通过仔细研究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:         .
.