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
循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行
当我尝试访问上述任何宏的单个元素时,将显示宏的每个元素。例如,如果Idisplay
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: .
.