循环标签变量

时间:2017-12-27 18:59:55

标签: loops label stata

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

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检查宏时,我的外引号(只有第一个和最后一个)消失了。我尝试在开头使用“”并在最后使用“”,但它仍然不起作用。有没有办法解决这个问题,还是有更聪明的方法可以自动标记多个变量,但标签不同?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您需要使用“”和“'来分隔本地宏。

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

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

统计员来源:(1)(2)

答案 2 :(得分:0)

另一个答案是,以这种方式工作几乎没有明显的好处。您有几个文本字符串准备为变量标签。将它们全部放在一个袋子里(这里是一个宏)是没有用的,除非你的变量名称具有非常简单的结构。你告诉我们什么,所以我们无法帮助如何循环名称。你只需要再次将标签从包中拿出来。

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

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. 只有在节省工作和时间的情况下,循环才有用。

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