我需要使用本地宏来遍历Stata中的部分变量名。
这是我尝试做的事情:
local phth mep mibp mbp
tab lod_`phth'_BL
Stata无法识别整个变量名称。
variable lod_mep not found
r(111);
如果我在'phth'之后删除下划线,它仍然无法识别宏名称之后的任何内容。
我想避免使用复杂的foreach
循环。
有没有办法只使用简单的宏? 谢谢!
答案 0 :(得分:3)
您的请求有点令人困惑。首先,这正是循环的目的,其次,Stata中的循环(在#34;介绍级别")非常简单。下面的例子有点荒谬(给定结构,有更简单的方法),但应该传达基本的想法。
// set up a similar variable name structure
sysuse auto , clear
rename (price mpg weight length) ///
(pref_base1_suff pref_base2_suff pref_base3_suff pref_base4_suff)
// define a local macro to hold the elements to loop over
local varbases = "base1 base2 base3 base4"
// refer to the items of the local macro in a loop
foreach b of local varbases {
summ pref_`b'_suff
}
有关help foreach
的语法,请参阅foreach
。特别要注意的是,由于Stata的 varlist 结构,可能甚至不需要上面使用的结构(参见help varlist
)。例如,继续上面的代码:
foreach v of varlist pref_base?_suff {
summ `v'
}
通配符?
代替一个字符。 *
可用于提高灵活性。但是,如果使用 varlist 允许的模式匹配不容易识别变量,则第一个示例中的循环非常简单 - 四行非常短的代码。
进一步反思(有时问题的结构锚定某种方法,当替代方法更直接时),在帮助文件中搜索有关tabulate命令(help tabulate
)的信息将引导您进入以下语法:tab1 varlist [if] [in] [weight] [, tab1_options]
鉴于以上关于使用 varlists 的讨论,您可以简单地编码
tab1 lod_m*_BL
当然,假设没有其他变量与您不想要报告频率表的模式相匹配。或者,
tab1 lod_mep_BL lod_mibp_BL lod_mbp_BL
尽管没有使用任何通配符或宏替换,也不会太长并且可以解决问题。