如何在Stata中子集本地宏

如何在Stata中子集本地宏,stata,Stata,假设我有一个包含一些变量名的本地宏 local indep "cat dog pig" 如果我希望宏中只包含猫和狗,如何从宏中删除pig?看来我自己已经找到了答案 local indep "cat dog pig" local indep = subinstr("`indep'", "pig", "", .) local indep = rtrim("`indep'") 但我不确定这是否是一个好的答案。只有当pig在宏中位于最后一位时,此操作才有效。上下文是要从列出变量名的字符串中删除变量名

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

local indep "cat dog pig"

如果我希望宏中只包含猫和狗,如何从宏中删除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

在一个程序中,这通常要好得多,尤其是如果您想一次删除多个名称(通常是多个单词)

不是这样。文本清管器将被删除,无论其出现在何处。如果有区别的话,那只是在剩下的空间方面。trimitrim会清理干净的。更大的问题是,如果你有猫狗猪小猪,想除掉猪而不是小猪。请看我的答案。Nick对此并不明确,但我会提到它,因为有些用户不知道正在使用的结构:宏扩展函数;并且可以通过help extended_fcn直接找到帮助。也可以在帮助宏中找到链接。