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

时间:2016-01-20 05:58:56

标签: stata

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

local indep "cat dog pig"

如果我希望宏只包含pigcat,如何从宏中删除dog

2 个答案:

答案 0 :(得分:4)

上下文是您要从列出它们的字符串中删除变量名称。 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

在程序中,这通常要好得多,特别是如果你想一次删除多个名字(更常见的是#34;单词")。

答案 1 :(得分:0)

似乎我自己找到了答案..

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

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