按索引引用宏值
Referencing macro values by index
我将下面的宏定义为变量 id
、var1
和 var2
的级别:
levelsof id, local(id_lev) sep(,)
levelsof var1, local(var1_lev) sep(,)
levelsof var2, local(var2_lev) sep(,)
我希望能够在 foreach
和 forval
循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行。
当我尝试访问上述任何宏的单个元素时,都会显示该宏的每个元素。例如,如果我 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
循环,我试图同时访问两个变量的宏索引值。
具体来说,我想同时调用 var1
和 var2
的第一个、第二个、...、最后一个元素,这样我就可以在循环中使用这些元素来生成一个新的多变的。我如何调整 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: .
.
我将下面的宏定义为变量 id
、var1
和 var2
的级别:
levelsof id, local(id_lev) sep(,)
levelsof var1, local(var1_lev) sep(,)
levelsof var2, local(var2_lev) sep(,)
我希望能够在 foreach
和 forval
循环期间通过索引引用存储在这些宏中的级别值。我正在学习如何使用宏,所以我不确定这是否可行。
当我尝试访问上述任何宏的单个元素时,都会显示该宏的每个元素。例如,如果我 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
循环,我试图同时访问两个变量的宏索引值。
具体来说,我想同时调用 var1
和 var2
的第一个、第二个、...、最后一个元素,这样我就可以在循环中使用这些元素来生成一个新的多变的。我如何调整 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: .
.