Stata:在循环中分配数字

时间:2015-08-05 16:22:03

标签: loops stata assign

我在Stata中创建循环时遇到问题。

我在Stata有一个数据集,我通过变量k10将我的观察分为6类。所以k10取值1,2,3,4,5,6。 现在我想根据它的类为每个观察分配一个值:

value 15 for k10=1
value 10 for k10=2
value 8  for k10=3
value 5  for k10=4
value 4  for k10=5
value 2  for k10=6

如果我创建一个新变量w10并且执行如下操作很容易:

gen w10 =. 
replace w10 = 15 if k10==1
replace w10 = 10 if k10==2
replace w10 = 8 if k10==3
replace w10 = 5 if k10==4
replace w10 = 4 if k10==5
replace w10 = 2 if k10==6

现在我试图通过使用循环来简化代码,遗憾的是它没有做我想要实现的目标。

我的循环:

gen w10=.
local A "1 2 3 4 5 6"
local B "15 10 8 5 4 2"
foreach y of local A {
foreach x of local B {
replace w10 = `x' if k10= `y'
}
}

循环为每个观察分配值2。原因是if条件k10 =`y'总是如此,并且每次都会覆盖被替换的w10s直到结束,对吧?

那么如何正确编写循环呢?

1 个答案:

答案 0 :(得分:2)

它实际上只是一个循环,而不是两个嵌套循环。那是你的主要错误,这是一般的编程逻辑。只有您最后一次通过内循环才会产生持续效果。尝试用手跟踪循环以查看此信息。

特别是在Stata中,使用1/6更好地循环整数forval;根本不需要定义本地宏的间接,然后强迫foreach查看该宏。这可以与将其他值分配给名称为1 ... 6的本地宏相结合。这里tokenize是要使用的专用命令。

试试这个:

gen w10 = .
tokenize "15 10 8 5 4 2"
quietly forval i = 1/6 {
    replace w10 = ``i'' if k10 == `i'
}

请注意,在测试相等性时,您需要==而不是=

请参阅(例如)this discussion

许多Stata用户希望在recode的一行中完成此操作。在这里,我专注于循环技术,这可能是更广泛的兴趣。