在Stata中使用循环变量之间的“或”运算符

时间:2016-07-05 05:07:55

标签: loops foreach stata

我有一组变量是字符串变量。对于字符串中的每个值,我创建一系列二进制(0,1)变量。

假设我的变量是Engine1 Engine2 Engine3。 可能的值为BHMBMNHLC或缺失(编码为".")。 除了缺失之外,变量的值是互斥的。

在一个假设的例子中,为了编写新变量,我将编写以下代码:

egen BHM=1 if Engine1=="BHM"|Engine2=="BHM"|Engine3=="BHM"`
replace BHM=0 if BHM==.
gen BMN=1 if Engine1=="BMN"|Engine2=="BMN"|Engine3=="BMN"`
replace BMN=0 if BMN==.
gen HLC=1 if Engine1=="HLC"|Engine2=="HLC"|Engine3=="HLC"
replace HLC=0 if HLC==.

我怎么能在循环中重写这段代码?我不明白如何在循环中使用“或”运算符|

1 个答案:

答案 0 :(得分:2)

首先请注意,egen是第一行中gen的拼写错误。

其次,请注意

gen BHM=1 if Engine1=="BHM"|Engine2=="BHM"|Engine3=="BHM"
replace BHM=0 if BHM==.

可以在一行中重写:

gen BHM = Engine1=="BHM"|Engine2=="BHM"|Engine3=="BHM"

现在了解方便的inlist()功能:

gen BHM = inlist("BHM", Engine1, Engine2, Engine3) 

如果这看起来很奇怪,那是因为你的数学教育导致你写了像

这样的东西

如果x = 1或y = 1或z = 1

但只有惯例会阻止你写作

如果1 = x或1 = y或1 = z

最后一招是写一个循环:

foreach v in BHM BMN HLC { 
    gen `v' = inlist("`v'", Engine1, Engine2, Engine3) 
}

目前尚不清楚你发现|有什么困难。你的代码在这方面很好。

学习者代码中经常出现的错误就像

gen y = 1 if x == 11|12|13 

这是合法的Stata,但几乎不是你想要的。 Stata将其解析为

gen y = 1 if (x == 11)|12|13 

并使用其规则,即非零参数在真或假评估中表示为true。因此,如果

y为1
x == 11 

12 // a non-zero argument, evaluates as true regardless of x 

13 // same comment 

学习者需要

gen y = 1 if (x == 11)|(x == 12)|(x == 13) 

其中括号可以省略。这是重复的,所以

gen y = 1 if inlist(x, 11, 12, 13) 
可以使用

代替。

有关inlist()的更多信息,请参阅 articles herehere第2.2节 和 here

有关Stata中true和false的更多信息,请参阅this FAQ