【问题标题】:R function with multiple operators具有多个运算符的 R 函数
【发布时间】:2018-02-12 16:29:47
【问题描述】:

数据范围从 -6 到 6,我正在尝试创建 3 个类别,但是即使有人在场,我的函数也没有返回类别 2 的任何人

FFMIBMDcopdcases$lowBMD = ifelse((FFMIBMDcopdcases$copd_Tscore >= -1) , 0,
                        ifelse((FFMIBMDcopdcases$copd_Tscore < -1), 1,
                        ifelse((FFMIBMDcopdcases$copd_Tscore <= -2.5), 2, NA)))

【问题讨论】:

  • 您的问题是订购。条件是按顺序检查的,小于 -2.5 的任何人也小于 -1,因此您将事物结构化的方式并不是真正的 else...
  • 在构建这样的结构时,有助于按照数字线进行分配。从Tscore &lt;= -2.5 开始,然后是Tscore &lt; -1,然后是Tscore &gt;= -1。但是使用cut(如下面的答案)将有助于避免这些陷阱
  • 刚刚意识到您从右到左遍历了数轴。如果您在第二步中使用了Tscore &gt; -2.5,然后再使用Tscore &lt;= 2.5,您将得到您想要的结果。

标签: r binning


【解决方案1】:

尝试使用cut 函数。示例:

myValues <- runif(n = 20, min = -6, max = 6)

as.numeric(as.character(cut(x = myValues, breaks = c(-Inf, -2.5, -1, Inf), labels = c(2, 1, 0))))

【讨论】:

    【解决方案2】:

    由于您想要一个数字结果,因此使用 findInterval 可能是最简单的,尽管您需要从 2 中减去结果以获得相反的顺序(2 表示最低,0 表示最高):

    FFMIBMDcopdcases$lowBMD = 2 - findInterval(FFMIBMDcopdcases$copd_Tscore , 
                                                          c(-Inf, -2.5, -1,  Inf) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2017-10-12
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多