我有一组变量,它们是字符串变量。对于字符串中的每个值,我创建了一系列二进制(0,1)变量。
假设我的变量是Engine1 Engine2 Engine3。可能的值有BHM、BMN、HLC或missing (编码为".")。变量的值是互斥的,除了缺少。
在一个假设的示例中,为了编写新变量,我将编写以下代码:
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==.我如何在循环中重写这段代码?我不知道如何在循环中使用"or“运算符|。
发布于 2016-07-05 16:07:58
首先请注意,在您的第一行中,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)
}目前还不清楚你觉得|有什么困难。你的代码在这方面是很好的。
在学习者代码中经常看到的bug是这样的
gen y = 1 if x == 11|12|13 这是合法的状态,但几乎不是你想要的。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()的更多信息,请参阅articles here和here第2.2节和here。
有关Stata中true和false的更多信息,请参阅this FAQ
https://stackoverflow.com/questions/38195530
复制相似问题