用\ textdollar替换Stata变量标签中的$

时间:2014-12-16 11:57:10

标签: stata

我在变量标签中有一些带有美元符号的变量(即$)。这会导致我的代码下游出现一些问题(我稍后会修改这些标签,并将美元符号注销为空的全局宏)。因此,我想使用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

这样就完全删除了标签。

2 个答案:

答案 0 :(得分:3)

您在subinstr()中遗漏了一个参数,helpn显示的内容:

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上。