【问题标题】:Replace $ in Stata variable labels with \textdollar用 \textdollar 替换 Stata 变量标签中的 $
【发布时间】:2014-12-16 11:57:10
【问题描述】:

我在变量标签中有一些带有美元符号的变量(即$)。这会在我的代码下游导致一些问题(我后来修改了这些标签,并且美元符号取消注册为空的全局宏)。所以我想使用 Stata 的 subinstr() 函数将这些美元符号替换为 LaTeX 的 \textdollar

但我想不通。这可能吗?还是我应该辞职以手动执行此操作?或者通过寻找变量标签中$ 附近或周围的其他字符?

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

这会完全移除标签。

【问题讨论】:

    标签: stata


    【解决方案1】:

    您在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
    

    【讨论】:

    • 有什么理由可以在我的玩具数据中起作用,但在我的真实数据中不起作用?在我的真实数据中,它只是删除了$
    • 好的,这是因为我的真实标签有$mil,而不仅仅是$,并且有所不同(在我的真实代码中,我的第四项是.,所以它不是' t 那 - 我在生成我的玩具示例时犯了换位错误)。我会更新问题。
    【解决方案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 上。

    【讨论】:

    • 我在 Stata 13.1 中发现 subinstr("some text", "", "xyz", .) 的计算结果为 some text。逻辑是空字符串不是任何字符串的子字符串,或者可能认为您必须在任何地方插入xyz!这与这里的报告相矛盾。
    • 谢谢@Nick。忘记报告:我在 Stata 12.1 上。
    • 据推测,原始海报也在 Stata 13.1 以外的其他地方,因为他声称:“这完全删除了标签。”
    • @RobertoFerrer 非常清楚。谢谢你。我的标签预先指定为 $mil 没有转义,所以我认为我没有任何选择以编程方式重新标记。
    • 不客气。您的标签不必与转义符\ 一起提供,但它们对于建立玩具示例是必需的。循环也是如此:它们在那里,因此不会发生宏替换。然后,Stata 会理解您指的是文本 $mil 而不是宏。见stata.com/support/faqs/programming/backslashes-and-macros
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多