值(使用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」破壞了這個變量。所以你沒有提供功能性代碼。 –