值(使用levelsof创建)我定义下面的宏作为变量id
,var1
和var2
的水平,使用levelsof
命令:引用宏由索引
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)
}
是不可能通过其索引引用宏的元素,还是我不正确地引用索引值?
更新:我已经得到的一切工作(谢谢),保存为适应上述中我试图相同指数在访问这两个变量的宏在威廉的回答给我的环路forval
环值。
具体而言,我想同时调用var1
和var2
的第一,第二,...最后一个元素,以便我可以使用循环中的元素生成新变量。我如何适应William建议的forval
循环来完成这个循环?
更新:我能够适应由威廉给出下面的代码来创建功能循环:
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)
}
宏是保持单值单实体。它们不是矢量或数组,因此索引引用没有意义。你的'display'命令中的'[1]'是产生错误信息的东西。该命令显示宏内容,然后被不是名称的尾部“[1]”弄糊涂了。 –
我们需要一个可重现的例子,我们需要知道你想创建什么变量。几乎可以肯定,有一种更直接的方式来创建任何使用宏或循环。由于'levelsof'中的逗号分隔使得解析宏变得更加困难,因为Stata中的“单词”是由空格分隔的项。这可能至少是环路问题的一部分。 –
由于'newvar'已经存在,代码将在循环中第二次失败。 - 除非不明原因的程序“whatever”破坏了这个变量。所以你没有提供功能性代码。 –