如何在 Stata 中对本地宏进行子集化

Oli*_* Ma 4 stata

假设我有一个包含一些变量名的本地宏

local indep "cat dog pig"
Run Code Online (Sandbox Code Playgroud)

pig如果我希望宏仅包含catand ,如何从宏中删除dog

Nic*_*Cox 6

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

. local names "cat dog pig piglet"

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

. di "`names'"
cat dog  let
Run Code Online (Sandbox Code Playgroud)

那不是你想要的。解决方案是坚持删除的必须是一个单词。在 Stata 中,单词可以或可以用空格分隔(除了用双引号引起来);对于 Stata 变量名称,不同的变量名称始终是不同的单词。

. local names "cat dog pig piglet"

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

. di "`names'"
cat dog  piglet
Run Code Online (Sandbox Code Playgroud)

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

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

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

. local names "cat dog pig piglet"

. local pig "pig"

. local names : list names - pig

. di "`names'"
cat dog piglet
Run Code Online (Sandbox Code Playgroud)

在程序中,这通常要好得多,特别是如果您想一次删除多个名称(更一般的“单词”)。

  • 尼克并没有明确说明这一点,但我会提到这一点,因为有些用户不知道正在使用的结构:_宏扩展函数_;并且可以直接使用“help Extended_fcn”找到帮助。还可以在“帮助宏”中找到链接。 (2认同)