是否可以在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:我很抱歉。我澄清了它是如何不起作用的。我错过了最大限制,谢谢。谢谢你的澄清。你可以在下面找到替代方案。