【问题标题】:Let a variable equal multiple values in an if-statement [duplicate]让一个变量等于if语句中的多个值[重复]
【发布时间】:2019-11-01 04:31:32
【问题描述】:

我正在 Stata 中进行数据清理,如果一整套其他变量等于 167,我需要将变量重新编码为等于 1

我可以使用下面的代码来做到这一点:

replace anyadl = 1 if diffdress==1 | diffdress==6 | diffdress==7 | ///
                      diffwalk==1  | diffwalk==6  | diffwalk==7  | ///
                      diffbath==1  | diffbath==6  | diffbath==7  | ///
                      diffeat==1   | diffeat==6   | diffeat==7   | ///
                      diffbed==1   | diffbed==6   | diffbed==7   | /// 
                      difftoi==1   | difftoi==6   | difftoi==7

但是,这样打出来效率很低,而且很容易出错。

有没有更简单的方法来做到这一点?

例如,以下几行:

replace anyadl = 1 if diff* == (1 | 6 | 7)

【问题讨论】:

  • 你的措辞和你的代码冲突。您的代码暗示这些变量中的任何一个都是 1、6、7 都可以。 “一整套其他变量”意味着它们都是。我已经按照您的代码所暗示的那样去做了。
  • 您的语法不是使用if 语句,而是使用if 限定符,
  • 你的名字以any开头我也认为表明你的真实意图,

标签: if-statement stata recode


【解决方案1】:

即使它是合法的,你的幻想语法也不会做你想做的事,例如 1|6|7 将被评估为 1。也就是说,在 Stata 1 OR 6 OR 7 实际上是 true OR true OR true,所以是真的,因此是 1,给定规则,非零作为输入是真,而真是 1 作为输出。表达式为1|6|7 是合法的;它是等式或不等式中的通配符。

退后一步,您的代码正在生成一个值为 1 或缺失的指标(有人说是虚拟)变量。实际上,如果使用值 0 和 1 创建这样的变量(在某些情况下也缺少),则这样的变量会更有用。

generate anyad1 = 0 

foreach v in dress walk bath eat bed toi { 
    replace anyad1 = 1 if inlist(diff`v', 1, 6, 7) 
} 

是一种方法。一般来说,注意inlist(foo, 1, 6, 7)inlist(1, foo, bar, bazz) 都是有用的结构。

阅读:

This paper on generating indicators

This one on useful functions

This one on inlist() and inrange()

FAQ on true and false in Stata

【讨论】:

  • 谢谢! inlist 函数正是我一直在寻找的,而我以前并不熟悉它。 (仅供参考,我知道我还需要为我的虚拟变量指定产生零值和缺失值的原因——我只是将我的代码限制在我有疑问的部分,以简化问题。)
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 2014-02-07
  • 2021-02-14
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多