Доступ к элементам списка в Stata - PullRequest
2 голосов
/ 05 октября 2011

Представьте, что вы должны запустить следующее в 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')

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Stata может сделать это.Синтаксис, который вы хотите использовать, должен выглядеть примерно так:

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 голосов
/ 03 ноября 2011

Пара других предложений и исправлений в вашем коде. Во-первых, я бы использовал -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'

}
...