繁体   English   中英

Stata:循环分配数字

[英]Stata: assign numbers in a loop

我在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进行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'
}

顺便== ,测试相等性时需要===

参见(例如) 本讨论

Stata的许多用户希望通过recode在一行中完成此操作。 在这里,我将重点介绍循环技术,这可能引起人们的广泛兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM