我在变量标签中有一些带有美元符号的变量(即$
)。这会导致我的代码下游出现一些问题(我稍后会修改这些标签,并将美元符号注销为空的全局宏)。因此,我想使用Stata的\textdollar
函数将这些美元符号替换为LaTeX的subinstr()
。
但我无法弄明白。这可能吗?或者我应该辞职,以手动更多这样做?或者通过在变量标签中$
附近或附近查找其他字符?
clear
set obs 10
generate x = runiform()
label variable x "Label with $mil"
generate y = runiform()
label variable y "Another label with $mil"
describe
foreach v of varlist * {
local name : variable label `v'
local name `=subinstr("`name'", "$mil", "\textdollar", .)'
label variable `v' "`name'"
}
describe
这样就完全删除了标签。
答案 0 :(得分:3)
您在subinstr()
中遗漏了一个参数,help
中n
显示的内容:
clear
set obs 10
generate x = runiform()
label variable x "Label with $"
local name: variable label x
local name = subinstr("`name'", "$", "\textdollar", .)
label variable x "`name'"
describe
答案 1 :(得分:2)
(问题已完全改变,这就是我给出单独答案的原因。)
在变量标签中加$something
有点问题,因为Stata会将其视为macro
,因此会取消引用它。 Stata在您的玩具示例中实际上做了什么?我们来看看:
这是预期的行为:
. local name = subinstr("some text", " ", "xyz", .)
. display "`name'"
somexyztext
以下内容,我不知道是否记录在案,不一定是预期的,但在理解中至关重要:
. local name = subinstr("some text", "", "xyz", .)
. display "`name'"
. (blank)
我在最后一行中强调本地name
没有任何内容。
在你的代码中,Stata将$mil
取消引用(因为它未事先声明;当然不是这样)。事实上,
label variable x "Label with $mil"
不符合您的意图。相反,您希望使用\
延迟宏替换:
label variable x "Label with \$mil"
对于另一部分,当你运行
时local name `=subinstr("`name'", "$mil", "\textdollar", .)'
评估为
local name `=subinstr("`name'", "", "\textdollar", .)'
并且本地name
现在什么也没有。这就结束了为什么你的代码能够完成它所做的事情的故事。
解决方案可能是:
clear
set obs 10
generate x = runiform()
label variable x "Label with \$mil"
generate y = runiform()
label variable y "Another \$mil"
describe
*-----
foreach v of varlist _all {
local name : variable label `v'
label variable `v' "`=subinstr("`name'\$mil", "\$mil", "\textdollar", .)'"
}
describe
但这仅在$mil
位于标签文字末尾时才有效。如果它位于某个中间位置,则必须使用另一种策略。
这一切都在Stata 12.1上。