2010-09-13 16 views
5

Adları indoor öneki ile başlayan birçok değişken var. indoor'dan sonra gelenler sayısal değildir (bu her şeyi daha basit hale getirir). Bu değişkenlerin her biri için bir tablo istiyorum.Stata'da yerel isimlere uzun bir değişken ad listesi nasıl atayacaksınız?

local indoor indoor* 
foreach i of local indoor { 
    tab `i' group, col freq exact chi2 
} 

Sorun umduğu gibi foreach komuta indoor, indoor soruların listesine indoor* olarak çözümlenir ve şudur: Yani bu kodu yazdım. Bu nedenle tab komutunu çok fazla değişken takip eder (sadece iki işlem yapabilir) ve bu bir hatayla sonuçlanır.

basit bir düzeltme ile ilk komutu yerine geçerli:

local indoor <full list of indoor questions> 

Ama bu daha sonra bu değişkenler için tüm isimleri bulup zorunda, yani önlemek ister kod yapıştırmak olacaktınız . Bunun için daha hızlı bir çözüm var gibi görünüyor ama hiç düşünemiyorum.

cevap

0

Sen

foreach i of var `indoor' { 
    tab `i' group, col freq exact chi2 
} 
+5

Bu, -foreach-bit'in sözdizimini karıştırır. Yardım elkitabı var1 ve var2 değişkenlerinin olduğu değişkenler "varyantı var1 var2" nin foreach i'yi kullanmak istediğinizi gösterir. VEYA "yerel iç mekanın foreach i" i kullanın, yukarıdaki örnekte olduğu gibi birleştirmeyin. Bu _works_ bu _works_, ancak, eğer bir yerel liste içinde bir liste varsa, değişkenler adlandırma değişkenlerinin kurallarına uymamışsa, o zaman "var 'iç mekanı' foreach i" değişkenindeki genişleme başarısız olur ve kullanıcıyı karıştırmayın. –

+0

Stata'nın komutu çalıştırmadan önce yerel/global makrosu açtığını anladığınız sürece çok da kötü değil. – Keith

6
döngüsündeki Stata'nın döngü değerlerini sormadan önce, değişken genişletme oluşturmak için ds veya unab numaralarını kullanmak gerekir. İşte

her birinin bir örnek:

******************! BEGIN EXAMPLE 

** THIS FIRST SECTION SIMPLY CREATES SOME FAKE DATA & INDOOR VARS ** 
    clear 
    set obs 10000 
    local suffix `c(ALPHA)' 
    token `"`suffix'"' 
    while "`1'" != "" { 
     g indoor`1'`2'`3' = 1+int((5-1+1)*runiform()) 
     lab var indoor`1'`2'`3' "Indoor Values for `1'`2'`3'" 
     mac shift 1 
     } 
    g group = rbinomial(1,.5) 
    lab var group "GROUP TYPE" 

** NOW, YOU SHOULD HAVE A BUNCH OF FAKE INDOOR 
**VARS WITH ALPHA, NOT NUMERIC SUFFIXES 

desc indoor* 

** foreach LOOP İÇİN VARLIST YARATMAK İÇİN ds KULLANMAK:'S BAZI BAŞLIKLAR VIA İLE tablolar biraz TEMİZLEME LET

ds indoor* 
    di "`r(varlist)'" 
    local indoorvars `r(varlist)' 

    local n 0 
    foreach i of local indoorvars { 

** display

local ++n 
    di in red "--------------------------------------------" 
    di in red "Table `n': `:var l `i'' by `:var l group'" 
    di in red "--------------------------------------------" 

** YOU R tab TABLOLAR

tab `i' group, col freq chi2 exact nolog nokey 
    } 
    ******************! END EXAMPLE 

VEYA yerine unab kullanarak: Eğer bilgilere dayanarak iç değişkenler seçme gibi, zor bir seçim kuralı kullanarak kapalı değişkenler seçmek istiyorsanız ds ait

******************! BEGIN EXAMPLE 
unab indoorvars: indoor* 
di "`indoorvars'" 

local n 0 
foreach i of local indoorvars { 
local ++n 
di in red "--------------------------------------------" 
di in red "Table `n': `:var l `i'' by `:var l group'" 
di in red "--------------------------------------------" 

tab `i' group, col freq chi2 nokey //I turned off exact to speed things up 
} 

******************! END EXAMPLE 

avantajları devreye girer değişken etiketinde veya başka bir özellikte.

-1
foreach v of varlist indoo* { 
do sth with `v' 
} 
1
Bu çalışacak

ile bu yapabilirdi. Bu sorudaki kodla neredeyse aynı.

unab indoor : indoor* 
foreach i of local indoor { 
    tab `i' group, col freq exact chi2 
} 
İlgili konular