Loops Stata:在循环中分配数字
我在Stata中创建循环时遇到问题 我在Stata有一个数据集,通过变量k10将我的观察分为6类。所以k10的值是1,2,3,4,5,6。 现在,我想根据每个观察值的类别为其指定一个值: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
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
在一行中完成此操作。在这里,我集中讨论循环技术,这可能是更广泛的兴趣 你能不能在一行中演示一下如何重新编码?谢谢