2017-03-04 62 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