Stata:在循环中分配数字
Stata: assign numbers in a loop
我在 Stata 中创建循环时遇到问题。
我在 Stata 中有一个数据集,我在其中 class 通过变量 k10 将我的观察结果分为 6 个类别。所以 k10 取值 1,2,3,4,5,6。
现在我想根据其 class 为每个观察值分配一个值:
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 直到结束,对吧?
那么怎样才能正确写出循环呢?
实际上只是一个循环,而不是两个嵌套循环。那是你的主要错误,这是一般的编程逻辑。只有最后一次你通过内部循环才会有持续的效果。尝试手动跟踪循环以查看这一点。
特别是在 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'
}
顺便请注意,在测试相等性时,您需要 ==
而不是 =
。
参见(例如)this discussion。
Stata 的许多用户都想用 recode
一行完成。在这里,我主要关注循环技术,它可能更受关注。
我在 Stata 中创建循环时遇到问题。
我在 Stata 中有一个数据集,我在其中 class 通过变量 k10 将我的观察结果分为 6 个类别。所以 k10 取值 1,2,3,4,5,6。 现在我想根据其 class 为每个观察值分配一个值:
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 直到结束,对吧?
那么怎样才能正确写出循环呢?
实际上只是一个循环,而不是两个嵌套循环。那是你的主要错误,这是一般的编程逻辑。只有最后一次你通过内部循环才会有持续的效果。尝试手动跟踪循环以查看这一点。
特别是在 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'
}
顺便请注意,在测试相等性时,您需要 ==
而不是 =
。
参见(例如)this discussion。
Stata 的许多用户都想用 recode
一行完成。在这里,我主要关注循环技术,它可能更受关注。