【问题标题】:Stata: assign numbers in a loopStata:循环分配数字
【发布时间】:2015-08-05 16:22:03
【问题描述】:

我在 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-condition k10=`y' 总是为真,每次都会覆盖被替换的 w10s 直到结束,对吧?

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

【问题讨论】:

    标签: loops stata assign


    【解决方案1】:

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

    特别是在 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 合二为一。在这里,我专注于循环技术,这可能会引起更广泛的兴趣。

    【讨论】:

    • 你能不能用一行代码来说明它是如何完成的?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多