嵌套的for循环:已定义错误变量 [英] Nested for-loop: error variable already defined

查看:22
本文介绍了嵌套的for循环:已定义错误变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Stata中有一个嵌套循环,其中包含四个级别的foreach语句。通过这个循环,我尝试创建一个名为strata的新变量,范围从1到40。

    foreach x in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 {
         foreach r in 1 2 3 4 5 {
             foreach s in 1 2 {
                 foreach a in 1 2 3 4 {
                    gen strata= `x' if race==`r' & sex==`s' & age==`a'
                }
            }
    }
}

我收到一个错误:

&q;已定义变量层

即使有错误,循环也会分配strata=1,但不会分配其余的层。所有其他单元格缺失/为空。

示例数据:

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte(age sex race)
1 2 2
1 2 1
1 1 1
1 1 1
1 2 1
2 2 1
2 2 1
4 2 1
1 2 1
4 2 1
3 2 1
2 2 1
4 2 1
4 2 2
3 2 1
4 1 3
4 2 1
4 2 1
2 1 2
4 2 1
2 2 1
3 2 1
3 2 1
1 2 3
4 2 1
1 2 5
4 2 1
4 2 1
4 2 2
4 2 1
2 2 1
4 1 1
3 2 1
1 2 1
2 2 1
4 2 1
1 2 2
2 2 3
1 1 3
4 2 1
2 2 3
1 2 1
1 1 1
2 2 3
1 2 1
1 1 3
1 2 1
2 2 1
3 2 1
1 2 1
4 2 1
1 2 2
1 2 1
2 2 1
4 2 1
4 2 1
1 2 1
1 2 1
4 2 1
2 2 1
4 2 1
1 2 1
1 1 3
2 2 1
1 1 1
4 1 1
3 2 1
2 2 1
1 2 1
1 1 1
2 2 3
4 2 2
2 2 1
2 2 1
3 2 1
2 2 2
3 2 1
2 1 1
1 1 1
3 2 1
1 2 3
4 2 1
4 2 1
2 2 1
1 2 1
1 1 1
3 2 1
4 2 1
2 2 3
1 2 3
4 2 1
3 2 1
2 2 1
4 2 1
3 2 1
2 1 1
1 2 1
2 2 1
2 2 3
1 1 1
end
label values sex sex
label def sex 1 "male (1)", modify
label def sex 2 "female (2)", modify
label values race race
label def race 1 "non-Hispanic white (1)", modify
label def race 2 "black (2)", modify
label def race 3 "AAPI/other (3)", modify
label def race 5 "Hispanic (5)", modify

推荐答案

generate用于生成新变量。代码第二次到达generate语句时,代码会因为给定的原因而失败。

一个答案是,您需要将变量generate放在循环外部,然后replace放在内部。

由于其他原因,您的代码可以分阶段重写。

首先,使用forvalues可以更容易、更高效地指定整数序列,<2-7]可以缩写为:我倾向于写forval

gen strata = . 
forval x = 1/40 {
    forval r = 1/5 {
        forval s = 1/2 {
            forval a = 1/4 {
                replace strata = `x' if race==`r' & sex==`s' & age==`a'
            }
        }
    }
}

其次,代码存在任何缺陷。最后都是40!

第三,您可以更直接地进行分配,比如通过

gen strata = 8 * (race - 1) + 4 * (sex - 1) + age  

这是一个独立的、可重现的演示:

clear
set obs 5
gen race = _n
expand 2
bysort race : gen sex = _n
expand 4
bysort race sex : gen age = _n
gen strata  = 8 * (race - 1) + 4 * (sex - 1) + age
isid strata

显然,您可以也应该为不同的首选方案更改配方。

这篇关于嵌套的for循环:已定义错误变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆