如何在 Stata 中对局部宏进行子集化

How to subset a local macro in Stata

假设我有一个包含一些变量名的局部宏

local indep "cat dog pig"

如果我希望宏只包含 catdog,如何从宏中删除 pig

看来我自己找到了答案..

local indep "cat dog pig"
local indep = subinstr("`indep'", "pig", "", .)
local indep = rtrim("`indep'")

但我不确定这是否是一个好的答案。仅当 pig 在宏中排在最后时才有效。

上下文是您要从列出它们的字符串中删除变量名称。 OP 答案中的 subinstr() 解决方案仅在要删除的文本作为整个变量名仅出现一次并且不作为另一个变量名的一部分出现时才有效。因此,使用等效但不相同的语法从该列表中删除 pig 的结果是

. local names "cat dog pig piglet"

. local names : subinstr local names "pig" "", all

. di "`names'"
cat dog  let

这不是你想要的。解决办法是坚持删除的一定是一个词。在 Stata 中,单词可以或可以用空格分隔(除了用双引号括起来);在 Stata 变量名的情况下,不同的变量名总是不同的词。

. local names "cat dog pig piglet"

. local names : subinstr local names "pig" "", word

. di "`names'"
cat dog  piglet

在处理变量名列表时,Stata 不关心多个空格而不是单个空格,所以也不需要你。但如果他们冒犯了,他们可以减少到单个空间。

另请参阅函数 subinstr()subinword() 以了解本质上相似的方法。在一些旧版本的 Stata 中,对此类函数的字符串长度有相当严格的限制,这使得使用上面使用的结构 : subinstr 对所有但非常短的列表都是可取的。

然而,这是一个完全不同的解决方案:

. local names "cat dog pig piglet"

. local pig "pig"

. local names : list names - pig

. di "`names'"
cat dog piglet

在一个程序中,这通常要好得多,特别是如果您想一次删除多个名称(通常 "words")。