2011-10-05 66 views
2

想象一下,你必須運行在Stata訪問列表元素在Stata

以下
tab var1 region if var1 > 4 

tab var2 region if var2 > 32 

tab var3 region if var3 > 7 

等了很多變數。請注意,輸入到if的過濾器取決於變量。

我想通過遍歷變量列表來做同樣的事情。像

thresholdList = "4 32 7 ..." /// don't know if this works 

foreach myvar of var1 var2 var3 ... { 
    tab `myvar' region if `myvar' > thresholdList(`counter') 
    local counter = `counter' + 1 
} 

`

東西顯然,這裏的代碼上面並沒有在Stata工作。我想了解我如何定義,包括值列表的宏和訪問列表中明確的每一個元素,即

thresholdList(`counter') 

回答

4

塔塔能做到這一點。您要使用的語法應該是這樣的:

local thresholdlist "4 32 7" 
local varlist "var1 var2 var3" 

local numitems = wordcount("`thresholdlist'") 

forv i=1/`numitems' { 
local thisthreshold : word `i' of `thresholdlist' 
local thisvar : word `i' of `varlist' 
di "variable: `thisvar', threshold: `thisthreshold'" 

    tab `thisvar' region if `thisvar' > `thisthreshold' 

} 

參見:http://www.stata.com/support/faqs/lang/parallel.html

+0

+1這將是有益的,但是,明確說明這些命令:「forvalues」,「display」等。 – StasK

+0

我從以下文章中學到了很多關於'forvalues'和'foreach':http://www.stata-journal.com/article.html?article=pr0005 – 2011-10-08 16:39:27

0

一對夫婦的其他建議和修正你的代碼 - 首先,我會使用-tokenize-遍歷您項目列表,第二個使用本地宏來存儲您的thresholdList', and finally use "local counter ++反'」,而不是‘本地計數器=計數+ 1’進行迭代貴方,所以:

clear 
set obs 200 
forval n = 1/3 { 
    g var`n' = ceil(runiform()*10) 
    } 
g region = 1 


loc thresholdList "4 32 7 " //here's your list 
token `"`thresholdList'"' 
**notice how tokenize stores these values: 
di "`1'" 
di "`2'" 
**now you'll iterate i to reference the token locations: 
loc i = 1 
foreach myvar in var1 var2 var3 { //use 'of' not 'in' 
    tab `myvar' region if `myvar' > ``i'' 
    loc i `++i' //iterates `i' 

}