[英]Using an “or” operator between variables for a loop in Stata
我有一组作为字符串变量的变量。 对于字符串中的每个值,我创建一系列二进制(0,1)变量。
假设我的变量是Engine1 Engine2 Engine3
。 可能的值为BHM
, BMN
, HLC
或缺少(编码为"."
)。 变量的值互斥,除非丢失。
在一个假设的示例中,要编写新变量,我将编写以下代码:
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==.
我该如何在循环中重写此代码? 我不明白如何使用“或”运算符|
在一个循环中。
首先请注意, 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
并使用其规则,即非零参数在是非判断中表示真。 如果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()
更多信息,请参见此处 , 此处 2.2节和此处 。
有关Stata中真假的更多信息,请参见此常见问题解答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.