2017-12-27 2442 views
1

我正在尝试为标签变量创建一个循环。对于这一点,我想用下面的宏:标签变量循环

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宏。我在开始时尝试使用`“,最后使用”',但它仍然不起作用。有没有办法解决这个问题,还是有更智能的方法来自动标记多个变量,但是标签不同?

+0

这个问题可能是它们不在同一行,如果你在开始处使用'“而在最后使用”'而整个命令应该在同一行上。 –

+0

你应该显示不起作用的代码。否则,我们无法猜测问题。 –

回答

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 

在这种情况下,你确实会要么必须定义在同一行的整个宏观,或做零部件和如上图所示合并后的部分。

来源在Statalist:(1)(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. 循环只有在节省您的工作和时间时才有用。

当然,你必须键入label var反复,但你喜欢的文本编辑器应该那么容易。

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 
+0

谢谢,这是我需要的! –

+0

好。如果它适合你,“接受”我的回答将会提高你在Stack Exchange上的声望,以及我的声望。您应该在投票上/下箭头下方的每个答案的左上角看到一个复选标记。 – 2018-01-02 16:29:11