【问题标题】:Loop for label variables循环标签变量
【发布时间】:2017-12-27 18:59:54
【问题描述】:

我正在尝试创建一个用于标记变量的循环。为此,我正在尝试使用以下宏:

local diaglbl "=1 if high blood pressure diag" "=1 if mult diag high blood press" "=1 if coronary hrt disease diag" ///
"=1 if angina diagnosis" "=1 if heart attack diag" "=1 if other heart disease diag" "=1 if stroke diagnosis" ///
"=1 if emphysema diagnosis" "=1 if chronc bronchits last 12 mths" "=1 if high cholesterol diagnosis" ///
"=1 if cancer diagnosis" "=1 if diabetes diagnosis" "=1 if joint pain last 12 months" ///
"=1 if arthritis diagnosis" "=1 if asthma diagnosis"

问题是当我使用macro dir 检查宏时,我的外部引号(仅第一个和最后一个)消失了。我尝试在开头使用 `" 并在结尾使用 "' ,但它仍然不起作用。有没有办法解决这个问题,或者有更聪明的方法来自动标记多个变量,但使用不同的标签?

【问题讨论】:

  • 问题可能是它们不在同一行,如果您在开头使用 `" 并在结尾使用 "' 并且整个命令在同一行上它应该可以工作。
  • 您应该显示不起作用的代码。否则,我们无法猜测问题所在。

标签: loops label stata


【解决方案1】:

也许下面的代码会为您指明一个有用的方向。然而,在为我自己写作时,我发现使用循环而不是使用多个单行命令进行编码没有任何优势。事实上,知道什么标签与什么变量搭配是很尴尬的,它为犯错打开了大门。在我关心的工作中,我会为每个命令使用一行。在我看来,循环并不简单。

the answer above from one angry researcher 中关于需要在一行中定义整个宏的语句与您的 newlabels 本地宏有关,该宏本身包含带引号的字符串。下面的代码通过使用#delimit 命令来解决该问题,以允许Stata 代码的单个“行”跨越多行文本,并在它们周围加上复合引号。我要补充一点,虽然我的代码在单独的行中显示每个标签,但您可以在每一行放置多个标签,就像在派生标签的示例中所做的那样。

clear
set obs 1
generate actlim = 1
generate age = 1
#delimit ;
local newvars 
    actlim
    age
    ;
local newlabels `"
    "actlim label"
    "age label"
    "'
    ;
#delimit cr
local nv : word count `newvars'
forvalues i = 1/`nv' {
    local v : word `i' of `newvars'
    local l : word `i' of `newlabels'
    label variable `v' "`l'"
}
describe

【讨论】:

  • 谢谢,这正是我需要的!
  • 好。如果它对您有用,“接受”我的回答将提高您和我在 Stack Exchange 上的声誉。您应该会在每个答案的左上角、向上/向下投票箭头下方看到一个复选标记。
【解决方案2】:

您需要使用 `" 和 "' 来分隔本地宏。

local part1 `""=1 if high blood pressure diag" "=1 if mult diag high blood press" "=1 if coronary hrt disease diag""'
local part2 `""=1 if angina diagnosis" "=1 if heart attack diag" "=1 if other heart disease diag" "=1 if stroke diagnosis""'
local part3 `""=1 if emphysema diagnosis" "=1 if chronc bronchits last 12 mths" "=1 if high cholesterol diagnosis""'
local part4 `""=1 if cancer diagnosis" "=1 if diabetes diagnosis" "=1 if joint pain last 12 months""'
local part5 `""=1 if arthritis diagnosis" "=1 if asthma diagnosis""'

local diaglbl = `"`part1' `part2' `part3' `part4' `part5'"'          

macro dir

在这种情况下,您确实必须在一行中定义整个宏,或者分部分进行,然后如上图所示合并各部分。

Statalist 来源:(1), (2)

【讨论】:

    【解决方案3】:

    另一个答案是,以这种方式工作几乎没有明显的收获。您准备了几个文本字符串作为变量标签。将它们全部放在一个包中(这里是宏)是没有目的的,除非您的变量名称具有非常简单的结构。您对此一无所知,因此我们无法帮助您了解如何遍历名称。您只需再次从袋子中取出标签即可。

    一个简单但实​​用的方法就是有一系列命令

    label var hbp "=1 if high blood pressure diag" 
    label var mhbp "=1 if mult diag high blood press" 
    

    进一步假设这些是指标(虚拟)变量,更简单的标签,例如

    label var hbp "high blood pressure diag" 
    label var mhbp "mult high blood press" 
    

    会有所帮助,只需让您解释一下,1 表示诊断,0 表示诊断。这为使用完整短语留下了更多空间,这在表格和图表中看起来会更好。

    一般原则:

    1. 相同的文本无助于区分。

    2. 循环只有在节省您的工作和时间时才是好的。

    当然,您必须反复输入label var,但您最喜欢的文本编辑器应该可以轻松完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2015-11-25
      • 1970-01-01
      • 2016-03-23
      • 2012-03-28
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多