0

我需要使用本地宏来遍历 Stata 中变量名的一部分。

这是我试图做的:

local phth mep mibp mbp
tab lod_`phth'_BL

Stata 不会识别整个变量名。

variable lod_mep not found
r(111);

如果我在“phth”之后删除下划线,它仍然无法识别宏名称之后的任何内容。

我想避免使用复杂的foreach循环。

有什么方法可以只使用简单的宏来完成吗?谢谢!

4

1 回答 1

3

你的要求有点混乱。首先,这正是循环的目的,其次,Stata 中的循环(在“入门级”)非常简单。下面的例子有点荒谬(鉴于结构,有更简单的方法来解决这个问题),但应该传达基本思想。

// 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允许的模式匹配无法轻松识别您的变量,那么第一个示例中的循环就足够简单了——只有四行非常短的代码。


后记

经过进一步思考(有时问题的结构锚定某种方法,而另一种方法更直接),在帮助文件中搜索有关制表命令 ( help tabulate) 的信息将引导您使用以下语法:tab1 varlist [if] [in] [weight] [, tab1_options]

鉴于上面关于使用varlist的讨论,您可以简单地编写代码

tab1 lod_m*_BL

当然,假设没有其他变量与您不想报告频率表的模式匹配。或者,

tab1 lod_mep_BL lod_mibp_BL lod_mbp_BL

虽然没有使用任何类型的通配符或宏替换,但它并没有更长的时间并且可以解决问题。

于 2015-10-15T22:37:03.550 回答