首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Stata中的循环变量之间使用"or“运算符

在Stata中的循环变量之间使用"or“运算符
EN

Stack Overflow用户
提问于 2016-07-05 13:07:55
回答 1查看 408关注 0票数 1

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

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

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

代码语言:javascript
复制
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“运算符|

EN

回答 1

Stack Overflow用户

发布于 2016-07-05 16:07:58

首先请注意,在您的第一行中,egengen的拼写错误。

其次,请注意

代码语言:javascript
复制
gen BHM=1 if Engine1=="BHM"|Engine2=="BHM"|Engine3=="BHM"
replace BHM=0 if BHM==.

可以在一行中重写:

代码语言:javascript
复制
gen BHM = Engine1=="BHM"|Engine2=="BHM"|Engine3=="BHM"

现在了解一下方便的inlist()函数:

代码语言:javascript
复制
gen BHM = inlist("BHM", Engine1, Engine2, Engine3) 

如果这看起来很奇怪,那是因为你的数学教育让你写下了这样的东西

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

但只有惯例会阻止你写作

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

最后一个技巧是编写一个循环:

代码语言:javascript
复制
foreach v in BHM BMN HLC { 
    gen `v' = inlist("`v'", Engine1, Engine2, Engine3) 
}

目前还不清楚你觉得|有什么困难。你的代码在这方面是很好的。

在学习者代码中经常看到的bug是这样的

代码语言:javascript
复制
gen y = 1 if x == 11|12|13 

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

代码语言:javascript
复制
gen y = 1 if (x == 11)|12|13 

并使用其规则,即在真假评估中,非零参数意味着真。因此,如果y为1,则

代码语言:javascript
复制
x == 11 

代码语言:javascript
复制
12 // a non-zero argument, evaluates as true regardless of x 

代码语言:javascript
复制
13 // same comment 

学习者需要

代码语言:javascript
复制
gen y = 1 if (x == 11)|(x == 12)|(x == 13) 

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

代码语言:javascript
复制
gen y = 1 if inlist(x, 11, 12, 13) 

可以改为使用。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38195530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档