我有3个连续变量X1
,X2
,X3
和一个变量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'
}
}
}
但它也不起作用。
答案 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