2010-09-13 46 views
5

我有許多變量,其名稱以前綴indoor開頭。 indoor後面的數字不是數字(這會使一切變得簡單)。我想爲這些變量中的每一個製表。所以我寫了這個代碼:在Stata中,如何將一長串變量名稱分配給本地宏?

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

的問題是indoorforeach命令解析爲indoor*,而不是的indoor問題清單,正如我希望的。由於這個原因,tab命令後面跟着太多的變量(它只能處理兩個變量),這會導致錯誤。

簡單的解決方法是使用來替代第一個命令:

local indoor <full list of indoor questions> 

但是,這是我想什麼來避免,即必須找到這些變量的所有名稱,然後將它們粘貼代碼。似乎有一個更快的解決方案,但我想不出任何。

回答

0

您可以用

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

這混合了-foreach-一點的語法。幫助手冊表明你想要使用「varlist var1 var2的foreach i」,其中var1和var2是變量,或者使用「foreach i of local indoor」,而不是像上面的例子那樣合併它們。然而,在這個例子中,如果你在本地'indoor'中有一個不符合在-varlist-中命名變量規則的列表,那麼var_external的'foreach i'中的varlist擴展將會失敗並讓用戶感到困惑。 – 2010-12-30 05:36:45

+0

只要你理解Stata在執行命令之前解包本地/全局宏,它並不是很糟糕。 – Keith 2011-10-19 19:34:36

6

訣竅是在要求Stata循環訪問foreach循環中的值之前,使用dsunab創建varlist擴展。

這裏的每個的一個示例:

******************! 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* 

** USE ds創建你varlist中FOR THE foreach LOOP:

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

    local n 0 
    foreach i of local indoorvars { 

** LET'S清理表A位,且某些標頭VIA display

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

**你[R tab TABLES

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

或使用unab代替:

******************! 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 

ds的優勢來發揮作用,如果你想用一個棘手的選擇規則,如基於信息選擇室內瓦爾選擇您的室內瓦爾在可變標籤或其他特徵中。

-1
foreach v of varlist indoo* { 
do sth with `v' 
} 
1

這將工作做到這一點。它與問題中的代碼幾乎相同。

unab indoor : indoor* 
foreach i of local indoor { 
    tab `i' group, col freq exact chi2 
} 
相關問題