我有一组变量是字符串变量。对于字符串中的每个值,我创建一系列二进制(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==.
我怎么能在循环中重写这段代码?我不明白如何在循环中使用“或”运算符|
。
答案 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 here
和
here第2.2节
和
here。
有关Stata中true和false的更多信息,请参阅this FAQ