2017-12-27 2443 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