是否可以在Stata中的函数内调用全局宏?
我有一组变量,这些变量的列表保存在全局宏中,以便在函数中使用它们是否可以在Stata中的函数内调用全局宏?,stata,Stata,我有一组变量,这些变量的列表保存在全局宏中,以便在函数中使用它们 global inlist_cond "amz2002ras_clss, amz2003ras_clss, amz2004ras_clss, amz2005ras_clss, amz2006ras_clss, amz2007ras_clss, amz2008ras_clss, amz2009ras_clss, amz2010ras_clss, amz2011ras_clss" 之所以将它们保存在宏中,是因为列表将处于循环中,其内
global inlist_cond "amz2002ras_clss, amz2003ras_clss, amz2004ras_clss, amz2005ras_clss, amz2006ras_clss, amz2007ras_clss, amz2008ras_clss, amz2009ras_clss, amz2010ras_clss, amz2011ras_clss"
之所以将它们保存在宏中,是因为列表将处于循环中,其内容将根据年份而变化
我需要做的是生成一个虚拟变量,如果宏列表中的任何变量具有水分类,那么water_dummy==1。在斯塔塔,我需要写作
gen water_dummy = inlist("WATER", "$inlist_cond")
,理想情况下应转化为
gen water_dummy = inlist("WATER", amz2002ras_clss, amz2003ras_clss, amz2004ras_clss, amz2005ras_clss, amz2006ras_clss, amz2007ras_clss, amz2008ras_clss, amz2009ras_clss, amz2010ras_clss, amz2011ras_clss)
但这不起作用——执行的代码没有任何错误,但伪变量只包含0。我知道可以在Stata中的函数内调用宏,但当宏包含一整列条件时,我从未尝试过。有什么想法吗?如果您的数据结构与以下示例类似,您可以从egenmore ssc install egenmore尝试使用egen函数incss: 请注意,它搜索子字符串,查看最后一个示例观察的结果 具有实现不同结果的循环的解决方案是:
gen watindic2 = 0
forvalues i = 2009/2010 {
replace watindic2 = 1 if amz`i' == "water"
}
list
另一个解决方案涉及重塑,但我将不谈这一点。如果您的数据结构类似于以下示例中的数据结构,您可以从egenmore ssc install egenmore尝试使用egen函数incss: 请注意,它搜索子字符串,查看最后一个示例观察的结果 具有实现不同结果的循环的解决方案是:
gen watindic2 = 0
forvalues i = 2009/2010 {
replace watindic2 = 1 if amz`i' == "water"
}
list
另一个解决方案涉及重塑,但我就不谈了。指定了一个文本字符串,generate语句中的双引号坚持使用该字符串,然后您将文本与文本进行比较,而该比较根本不与数据进行比较
. clear
. set obs 1
number of observations (_N) was 0, now 1
. gen a = "water"
. gen b = "wine"
. gen c = "beer"
. global myvars "a,b,c"
. gen found1 = inlist("water", "$myvars")
. gen found2 = inlist("water", $myvars)
. list
+---------------------------------------+
| a b c found1 found2 |
|---------------------------------------|
1. | water wine beer 0 1 |
+---------------------------------------+
第一个比较相当于
. di inlist("water", "a,b,c")
0
它找不到匹配,因为水不匹配的单一!其他论点
函数或命令调用中当然允许宏引用:因为在检查语法之前,每个宏名称都被其内容替换,所以函数或命令甚至不知道曾经使用过宏引用
正如@Aspen Chen简洁地指出的,只要inlist语法仍然合法,省略双引号就可以满足您的需要 如果指定了一个文本字符串(generate语句中的双引号坚持使用该字符串),则您将文本与文本进行比较,而该比较根本不与数据进行比较
. clear
. set obs 1
number of observations (_N) was 0, now 1
. gen a = "water"
. gen b = "wine"
. gen c = "beer"
. global myvars "a,b,c"
. gen found1 = inlist("water", "$myvars")
. gen found2 = inlist("water", $myvars)
. list
+---------------------------------------+
| a b c found1 found2 |
|---------------------------------------|
1. | water wine beer 0 1 |
+---------------------------------------+
第一个比较相当于
. di inlist("water", "a,b,c")
0
它找不到匹配,因为水不匹配的单一!其他论点
函数或命令调用中当然允许宏引用:因为在检查语法之前,每个宏名称都被其内容替换,所以函数或命令甚至不知道曾经使用过宏引用
正如@Aspen Chen简洁地指出的,只要inlist语法仍然合法,省略双引号就可以满足您的需要 不为我工作不是一个充分的问题报告。如果斯塔塔抱怨的话,它抱怨什么?请注意,字符串的最大参数数为10,您还有更多参数。请参阅列表中的帮助。如果您没有达到列表中的限制,删除双引号应该可以解决问题。@RobertoFerrer:我很抱歉。我澄清了它是如何不起作用的。我错过了最大限制,谢谢。谢谢你的澄清。你可以在下面找到替代方案。不为我工作不是一份充分的问题报告。如果斯塔塔抱怨的话,它抱怨什么?请注意,字符串的最大参数数为10,您还有更多参数。请参阅列表中的帮助。如果您没有达到列表中的限制,删除双引号应该可以解决问题。@RobertoFerrer:我很抱歉。我澄清了它是如何不起作用的。我错过了最大限制,谢谢。谢谢你的澄清。你可以在下面找到替代方案。