我将下面的宏定义为变量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:
我已经完成了所有工作(谢谢),除了适应威廉回答上面循环中给出的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)
}
答案 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: .
.