如何通过变量的值和组进行嵌套循环?

时间:2016-06-30 04:20:02

标签: stata

我有3个连续变量X1X2X3和一个变量Y。我有一个循环来按照Y总结X:

foreach X of var X1 X2 X3 {  
by Y, sort: summarize `X'  
}

现在我有另一个组变量Z:假设它有值1,2,3。我怎样才能使上面的循环遍历Z的每个值(也就是说,嵌套当前循环进入Z值的循环?

如果不涉及Y,那么我可以这样做:

foreach i of num 1/3 {  
foreach X of var X1 X2 X3 {  
summarize `X' if Z = `i'  
}  
}

但如果有Y,则采用类似的方式,即:

foreach i of num 1/3 {  
foreach X of var X1 X2 X3 {  
by Y, sort: summarize `X' if Z = `i'  
}  
}

不起作用。它说“语法无效”。

foreach i of num 1/3 {  
foreach j of num 0/2 {  
foreach X of var X1 X2 X3{  
summarize `X' if Z = `i' & Y = `j'  
}  
}  
}  

但它也不起作用。

1 个答案:

答案 0 :(得分:0)

错误是测试是否需要运算符==。运算符=通常仅表示赋值。 (在某些命令中可以看到异常。)

作为风格甚至效率的问题,经验丰富的Stata程序员尽可能使用forvalues而不是foreach

重写最复杂的例子就足够了:

forval i = 1/3 {  
    forval j = 0/2 {  
        foreach X of var X1 X2 X3 {  
            summarize `X' if Z == `i' & Y == `j'  
        }  
    }  
}  

of varlist语法有很多用途,但对于一个简单的例子

foreach X in X1 X2 X3 
通常没问题。

所有这一切,在这个例子中你根本不需要循环。以下是您可以运行的示例:

sysuse auto, clear 
bysort foreign rep78: summarize mpg price