Loops Stata:在循环中分配数字

Loops Stata:在循环中分配数字,loops,stata,assign,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

我在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'始终为真,每次都覆盖替换的w10,直到结束,对吗


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

它实际上只是一个循环,而不是两个嵌套的循环。这是您的主要错误,它是通用编程逻辑。只有最后一次通过内部循环时,效果才会持续。试着用手追踪这些循环以查看这一点

特别是在Stata中,使用
forval
,在整数
1/6
上循环要好得多;根本不需要间接定义一个本地宏,然后强制
foreach
查看该宏的内部。这可以与将其他值分配给名为
1
的本地宏相结合<代码>6。这里的
tokenize
是要使用的专用命令

试试这个:

gen w10 = .
tokenize "15 10 8 5 4 2"
quietly forval i = 1/6 {
    replace w10 = ``i'' if k10 == `i'
}
顺便注意,在测试相等性时,您需要
=
而不是
=

见(例如)


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

你能不能在一行中演示一下如何重新编码?谢谢