假设我有一个包含一些变量名的本地宏
local indep "cat dog pig"
如果我希望宏只包含pig
和cat
,如何从宏中删除dog
?
答案 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
在宏中位于最后时才有效。