2017-03-04 50 views
-1

值(使用levelsof创建)我定义下面的宏作为变量idvar1var2的水平,使用levelsof命令:引用宏由索引

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) 
} 

是不可能通过其索引引用宏的元素,还是我不正确地引用索引值?

更新:我已经得到的一切工作(谢谢),保存为适应上述中我试图相同指数在访问这两个变量的宏在威廉的回答给我的环路forval环值。

具体而言,我想同时调用var1var2的第一,第二,...最后一个元素,以便我可以使用循环中的元素生成新变量。我如何适应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) 

} 
+0

宏是保持单值单实体。它们不是矢量或数组,因此索引引用没有意义。你的'display'命令中的'[1]'是产生错误信息的东西。该命令显示宏内容,然后被不是名称的尾部“[1]”弄糊涂了。 –

+0

我们需要一个可重现的例子,我们需要知道你想创建什么变量。几乎可以肯定,有一种更直接的方式来创建任何使用宏或循环。由于'levelsof'中的逗号分隔使得解析宏变得更加困难,因为Stata中的“单词”是由空格分隔的项。这可能至少是环路问题的一部分。 –

+0

由于'newvar'已经存在,代码将在循环中第二次失败。 - 除非不明原因的程序“whatever”破坏了这个变量。所以你没有提供功能性代码。 –

回答

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:   . 
. 
+0

感谢您的帮助@WilliamLisowski。我得到了一切工作,直到你已经包含在底部的'forval'循环。它在你给出的例子中工作正常,但我试图同时在两个宏上完成一个循环。这就是为什么我最初的想法是将宏视为一个索引向量,我可以一次调用“var1”和“var2”的第一,第二,...元素。我已经更新了我的尝试,但是无法使用该语法。 – kathystehl

+0

我也可以提出一个新的问题,因为如果这更合适的话,这将特别适用于循环。 – kathystehl